diff --git a/.classpath b/.classpath
index 9ba6b8726..323d9666c 100644
--- a/.classpath
+++ b/.classpath
@@ -8,5 +8,6 @@
-
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..d7c37e410
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+local.properties
+bin
+gen
+.settings
+*~
diff --git a/Android.mk b/Android.mk
index a17c75e68..7184bd38b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -6,6 +6,7 @@ LOCAL_STATIC_JAVA_LIBRARIES += libdom
LOCAL_STATIC_JAVA_LIBRARIES += libio
LOCAL_STATIC_JAVA_LIBRARIES += libjutf
LOCAL_STATIC_JAVA_LIBRARIES += libjzlib
+LOCAL_STATIC_JAVA_LIBRARIES += libhtmlcleaner
LOCAL_MODULE_TAGS := eng
@@ -24,6 +25,7 @@ LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += libdom:libs/apache-mime4j-dom-0.7-SNAPSH
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += libio:libs/commons-io-2.0.1.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += libjutf:libs/jutf7-1.0.1-SNAPSHOT.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += libjzlib:libs/jzlib-1.0.7.jar
+LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += libhtmlcleaner:libs/htmlcleaner-2.2.jar
include $(BUILD_MULTI_PREBUILT)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index faf568c95..cdfe9b30b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,12 +1,12 @@
+
+
@@ -71,12 +73,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/HTMLCLEANER_LICENSE b/HTMLCLEANER_LICENSE
new file mode 100644
index 000000000..25c863f68
--- /dev/null
+++ b/HTMLCLEANER_LICENSE
@@ -0,0 +1,35 @@
+HtmlCleaner is distributed under BSD License. It gives the freedom for
+anyone to use, explore, modify, and distribute HtmlCleaner, but without any
+warranty.
+
+ Copyright (c) 2006-2011, HtmlCleaner team.
+ All rights reserved.
+
+ Redistribution and use of this software in source and binary forms,
+ with or without modification, are permitted provided that the
+ following conditions are met:
+
+ * Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+ * The name of HtmlCleaner may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/ant.properties b/ant.properties
new file mode 100644
index 000000000..cfc6e1ad4
--- /dev/null
+++ b/ant.properties
@@ -0,0 +1,23 @@
+# This file is used to override default values used by the Ant build system.
+#
+# This file must be checked in Version Control Systems, as it is
+# integral to the build system of your project.
+
+# This file is only used by the Ant script.
+
+# You can use this to override default values such as
+# 'source.dir' for the location of your java source folder and
+# 'out.dir' for the location of your output folder.
+
+# You can also use it define how the release builds are signed by declaring
+# the following properties:
+# 'key.store' for the location of your keystore and
+# 'key.alias' for the name of the key to use.
+# The password will be asked during the build when you use the 'release' target.
+
+# Indicates whether an apk should be generated for each density.
+split.density=false
+java.encoding=utf8
+# Project target.
+target=android-9
+extensible.libs.classpath=compile-only-libs
diff --git a/assets/emoticons/24hours.gif b/assets/emoticons/24hours.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/airplane.gif b/assets/emoticons/airplane.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/angry.gif b/assets/emoticons/angry.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/annoy.gif b/assets/emoticons/annoy.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/apple.gif b/assets/emoticons/apple.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/appli01.gif b/assets/emoticons/appli01.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/appli02.gif b/assets/emoticons/appli02.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/aquarius.gif b/assets/emoticons/aquarius.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/aries.gif b/assets/emoticons/aries.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/art.gif b/assets/emoticons/art.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/atm.gif b/assets/emoticons/atm.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bag.gif b/assets/emoticons/bag.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ban.gif b/assets/emoticons/ban.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/banana.gif b/assets/emoticons/banana.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bank.gif b/assets/emoticons/bank.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bar.gif b/assets/emoticons/bar.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/baseball.gif b/assets/emoticons/baseball.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/basketball.gif b/assets/emoticons/basketball.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bearing.gif b/assets/emoticons/bearing.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/beer.gif b/assets/emoticons/beer.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bell.gif b/assets/emoticons/bell.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bicycle.gif b/assets/emoticons/bicycle.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/birthday.gif b/assets/emoticons/birthday.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bleah.gif b/assets/emoticons/bleah.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bomb.gif b/assets/emoticons/bomb.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/book.gif b/assets/emoticons/book.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bottle.gif b/assets/emoticons/bottle.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/boutique.gif b/assets/emoticons/boutique.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bread.gif b/assets/emoticons/bread.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bud.gif b/assets/emoticons/bud.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/building.gif b/assets/emoticons/building.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bullettrain.gif b/assets/emoticons/bullettrain.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/bus.gif b/assets/emoticons/bus.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/by-d.gif b/assets/emoticons/by-d.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cafe.gif b/assets/emoticons/cafe.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cake.gif b/assets/emoticons/cake.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/camera.gif b/assets/emoticons/camera.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cancer.gif b/assets/emoticons/cancer.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/capricornus.gif b/assets/emoticons/capricornus.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/car.gif b/assets/emoticons/car.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/carouselpony.gif b/assets/emoticons/carouselpony.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cat.gif b/assets/emoticons/cat.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/catface.gif b/assets/emoticons/catface.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cd.gif b/assets/emoticons/cd.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/chair.gif b/assets/emoticons/chair.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cherry.gif b/assets/emoticons/cherry.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cherryblossom.gif b/assets/emoticons/cherryblossom.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/chick.gif b/assets/emoticons/chick.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/clear.gif b/assets/emoticons/clear.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/clip.gif b/assets/emoticons/clip.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/clock.gif b/assets/emoticons/clock.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cloud.gif b/assets/emoticons/cloud.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/clover.gif b/assets/emoticons/clover.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/club.gif b/assets/emoticons/club.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/coldsweats01.gif b/assets/emoticons/coldsweats01.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/coldsweats02.gif b/assets/emoticons/coldsweats02.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/confident.gif b/assets/emoticons/confident.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/copyright.gif b/assets/emoticons/copyright.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/crown.gif b/assets/emoticons/crown.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/crying.gif b/assets/emoticons/crying.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/cute.gif b/assets/emoticons/cute.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/d-point.gif b/assets/emoticons/d-point.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/danger.gif b/assets/emoticons/danger.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/dash.gif b/assets/emoticons/dash.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/delicious.gif b/assets/emoticons/delicious.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/denim.gif b/assets/emoticons/denim.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/despair.gif b/assets/emoticons/despair.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/diamond.gif b/assets/emoticons/diamond.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/dog.gif b/assets/emoticons/dog.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/dollar.gif b/assets/emoticons/dollar.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/door.gif b/assets/emoticons/door.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/down.gif b/assets/emoticons/down.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/downwardleft.gif b/assets/emoticons/downwardleft.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/downwardright.gif b/assets/emoticons/downwardright.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/drama.gif b/assets/emoticons/drama.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ear.gif b/assets/emoticons/ear.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/eight.gif b/assets/emoticons/eight.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/empty.gif b/assets/emoticons/empty.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/end.gif b/assets/emoticons/end.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/enter.gif b/assets/emoticons/enter.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/event.gif b/assets/emoticons/event.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/eye.gif b/assets/emoticons/eye.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/eyeglass.gif b/assets/emoticons/eyeglass.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/fastfood.gif b/assets/emoticons/fastfood.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/faxto.gif b/assets/emoticons/faxto.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/fish.gif b/assets/emoticons/fish.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/five.gif b/assets/emoticons/five.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/flag.gif b/assets/emoticons/flag.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/flair.gif b/assets/emoticons/flair.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/foot.gif b/assets/emoticons/foot.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/four.gif b/assets/emoticons/four.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/free.gif b/assets/emoticons/free.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/freedial.gif b/assets/emoticons/freedial.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/fuji.gif b/assets/emoticons/fuji.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/full.gif b/assets/emoticons/full.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/fullmoon.gif b/assets/emoticons/fullmoon.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/game.gif b/assets/emoticons/game.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/gasstation.gif b/assets/emoticons/gasstation.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/gawk.gif b/assets/emoticons/gawk.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/gemini.gif b/assets/emoticons/gemini.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/golf.gif b/assets/emoticons/golf.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/good.gif b/assets/emoticons/good.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/hairsalon.gif b/assets/emoticons/hairsalon.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/happy01.gif b/assets/emoticons/happy01.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/happy02.gif b/assets/emoticons/happy02.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/heart.gif b/assets/emoticons/heart.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/heart01.gif b/assets/emoticons/heart01.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/heart02.gif b/assets/emoticons/heart02.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/heart03.gif b/assets/emoticons/heart03.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/heart04.gif b/assets/emoticons/heart04.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/horse.gif b/assets/emoticons/horse.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/hospital.gif b/assets/emoticons/hospital.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/hotel.gif b/assets/emoticons/hotel.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/house.gif b/assets/emoticons/house.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/id.gif b/assets/emoticons/id.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/impact.gif b/assets/emoticons/impact.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/info01.gif b/assets/emoticons/info01.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/info02.gif b/assets/emoticons/info02.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/japanesetea.gif b/assets/emoticons/japanesetea.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/karaoke.gif b/assets/emoticons/karaoke.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/key.gif b/assets/emoticons/key.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/kissmark.gif b/assets/emoticons/kissmark.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/leftright.gif b/assets/emoticons/leftright.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/leo.gif b/assets/emoticons/leo.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/libra.gif b/assets/emoticons/libra.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/loveletter.gif b/assets/emoticons/loveletter.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/lovely.gif b/assets/emoticons/lovely.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/mail.gif b/assets/emoticons/mail.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/mailto.gif b/assets/emoticons/mailto.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/maple.gif b/assets/emoticons/maple.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/memo.gif b/assets/emoticons/memo.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/mist.gif b/assets/emoticons/mist.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/mobaq.gif b/assets/emoticons/mobaq.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/mobilephone.gif b/assets/emoticons/mobilephone.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/moneybag.gif b/assets/emoticons/moneybag.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/moon1.gif b/assets/emoticons/moon1.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/moon2.gif b/assets/emoticons/moon2.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/moon3.gif b/assets/emoticons/moon3.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/motorsports.gif b/assets/emoticons/motorsports.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/movie.gif b/assets/emoticons/movie.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/music.gif b/assets/emoticons/music.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/new.gif b/assets/emoticons/new.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/newmoon.gif b/assets/emoticons/newmoon.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ng.gif b/assets/emoticons/ng.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/night.gif b/assets/emoticons/night.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/nine.gif b/assets/emoticons/nine.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/noodle.gif b/assets/emoticons/noodle.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/nosmoking.gif b/assets/emoticons/nosmoking.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/note.gif b/assets/emoticons/note.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/notes.gif b/assets/emoticons/notes.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ok.gif b/assets/emoticons/ok.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/on.gif b/assets/emoticons/on.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/one.gif b/assets/emoticons/one.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/paper.gif b/assets/emoticons/paper.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/parking.gif b/assets/emoticons/parking.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pass.gif b/assets/emoticons/pass.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pc.gif b/assets/emoticons/pc.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pen.gif b/assets/emoticons/pen.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pencil.gif b/assets/emoticons/pencil.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/penguin.gif b/assets/emoticons/penguin.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/phoneto.gif b/assets/emoticons/phoneto.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pig.gif b/assets/emoticons/pig.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pisces.gif b/assets/emoticons/pisces.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pocketbell.gif b/assets/emoticons/pocketbell.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/postoffice.gif b/assets/emoticons/postoffice.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pouch.gif b/assets/emoticons/pouch.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/pout.gif b/assets/emoticons/pout.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/present.gif b/assets/emoticons/present.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/punch.gif b/assets/emoticons/punch.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/r-mark.gif b/assets/emoticons/r-mark.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/rain.gif b/assets/emoticons/rain.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/recycle.gif b/assets/emoticons/recycle.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/restaurant.gif b/assets/emoticons/restaurant.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ribbon.gif b/assets/emoticons/ribbon.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/riceball.gif b/assets/emoticons/riceball.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ring.gif b/assets/emoticons/ring.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/rock.gif b/assets/emoticons/rock.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/rouge.gif b/assets/emoticons/rouge.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/run.gif b/assets/emoticons/run.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/rvcar.gif b/assets/emoticons/rvcar.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sad.gif b/assets/emoticons/sad.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sagittarius.gif b/assets/emoticons/sagittarius.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sandclock.gif b/assets/emoticons/sandclock.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/school.gif b/assets/emoticons/school.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/scissors.gif b/assets/emoticons/scissors.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/scorpius.gif b/assets/emoticons/scorpius.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/search.gif b/assets/emoticons/search.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/secret.gif b/assets/emoticons/secret.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/seven.gif b/assets/emoticons/seven.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/shadow.gif b/assets/emoticons/shadow.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sharp.gif b/assets/emoticons/sharp.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/shine.gif b/assets/emoticons/shine.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ship.gif b/assets/emoticons/ship.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/shock.gif b/assets/emoticons/shock.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/shoe.gif b/assets/emoticons/shoe.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sign01.gif b/assets/emoticons/sign01.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sign02.gif b/assets/emoticons/sign02.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sign03.gif b/assets/emoticons/sign03.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sign04.gif b/assets/emoticons/sign04.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sign05.gif b/assets/emoticons/sign05.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/signaler.gif b/assets/emoticons/signaler.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/six.gif b/assets/emoticons/six.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ski.gif b/assets/emoticons/ski.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/slate.gif b/assets/emoticons/slate.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sleepy.gif b/assets/emoticons/sleepy.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/smile.gif b/assets/emoticons/smile.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/smoking.gif b/assets/emoticons/smoking.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/snail.gif b/assets/emoticons/snail.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/snow.gif b/assets/emoticons/snow.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/snowboard.gif b/assets/emoticons/snowboard.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/soccer.gif b/assets/emoticons/soccer.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/soon.gif b/assets/emoticons/soon.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/spa.gif b/assets/emoticons/spa.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/spade.gif b/assets/emoticons/spade.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sports.gif b/assets/emoticons/sports.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sprinkle.gif b/assets/emoticons/sprinkle.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/subway.gif b/assets/emoticons/subway.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sun.gif b/assets/emoticons/sun.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sweat01.gif b/assets/emoticons/sweat01.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/sweat02.gif b/assets/emoticons/sweat02.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/t-shirt.gif b/assets/emoticons/t-shirt.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/taurus.gif b/assets/emoticons/taurus.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/telephone.gif b/assets/emoticons/telephone.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/tennis.gif b/assets/emoticons/tennis.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/think.gif b/assets/emoticons/think.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/three.gif b/assets/emoticons/three.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/thunder.gif b/assets/emoticons/thunder.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/ticket.gif b/assets/emoticons/ticket.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/tm.gif b/assets/emoticons/tm.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/toilet.gif b/assets/emoticons/toilet.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/train.gif b/assets/emoticons/train.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/tulip.gif b/assets/emoticons/tulip.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/tv.gif b/assets/emoticons/tv.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/two.gif b/assets/emoticons/two.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/typhoon.gif b/assets/emoticons/typhoon.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/up.gif b/assets/emoticons/up.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/updown.gif b/assets/emoticons/updown.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/upwardleft.gif b/assets/emoticons/upwardleft.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/upwardright.gif b/assets/emoticons/upwardright.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/virgo.gif b/assets/emoticons/virgo.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/watch.gif b/assets/emoticons/watch.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/wave.gif b/assets/emoticons/wave.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/weep.gif b/assets/emoticons/weep.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/wheelchair.gif b/assets/emoticons/wheelchair.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/wine.gif b/assets/emoticons/wine.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/wink.gif b/assets/emoticons/wink.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/wobbly.gif b/assets/emoticons/wobbly.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/wrench.gif b/assets/emoticons/wrench.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/xmas.gif b/assets/emoticons/xmas.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/yacht.gif b/assets/emoticons/yacht.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/yen.gif b/assets/emoticons/yen.gif
old mode 100755
new mode 100644
diff --git a/assets/emoticons/zero.gif b/assets/emoticons/zero.gif
old mode 100755
new mode 100644
diff --git a/build.properties b/build.properties
deleted file mode 100644
index 7b7f4a0a4..000000000
--- a/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-application-package=com.fsck.k9
-target=android-9
diff --git a/build.xml b/build.xml
index 327b46f4d..04502dfc8 100644
--- a/build.xml
+++ b/build.xml
@@ -1,15 +1,14 @@
-
-
+
+
-
-
+
-
-
+
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
- Building version number ${version-name}
+
+
-
- Setting version to ${version-name}
- You can't set the version without passing -Dversion-name=1.234
-
-
-
-
-
-
-
+
-
- Bumping K-9 to ${version-name}
-
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the task.
+ - customize to your needs.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Building version number ${version-name}
+
+
+
+
+
+
+ Building version number ${version-name}
+
+
+
+ Setting version to ${version-name}
+ You can't set the version without passing -Dversion-name=1.234
+
+
+
+
+
+
+
+
+
+
+ Bumping K-9 to ${version-name}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- Creating library ${rclib} for remote control
- applications
-
-
+
+ Creating library ${rclib} for remote control applications
+
-
Uploading to Google Code using Google::Code::Upload
-
+
@@ -125,7 +159,7 @@
-
+
Installing ${out.debug.file} onto default emulator...
@@ -134,12 +168,20 @@
+
+
+ Reinstalling ${out.debug.file} onto default emulator...
+
+
+
+
+
+
-
-
+
@@ -159,27 +201,16 @@
bump-version: ant -Dversion-name=3.123 Bumps the project version to 3.123,tags and commits it astyle: Make K-9's source look like it's supposed to
+ eclipse: Apply template Eclipse settings
+
+
+
+
+
+
-
-
-
+
+
diff --git a/compile-only-libs/mockito-all-1.8.5.jar b/compile-only-libs/mockito-all-1.8.5.jar
new file mode 100644
index 000000000..4b0395ed8
Binary files /dev/null and b/compile-only-libs/mockito-all-1.8.5.jar differ
diff --git a/docs/activity_diagram.graphml b/docs/activity_diagram.graphml
new file mode 100644
index 000000000..a2f1a4216
--- /dev/null
+++ b/docs/activity_diagram.graphml
@@ -0,0 +1,936 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Accounts
+
+
+
+
+
+
+
+
+
+
+ FolderList
+
+
+
+
+
+
+
+
+
+
+ MessageList
+
+
+
+
+
+
+
+
+
+
+ MessageView
+
+
+
+
+
+
+
+
+
+
+ AccountSettings
+
+
+
+
+
+
+
+
+
+
+ AccountSetupIncoming
+
+
+
+
+
+
+
+
+
+
+ AccountSetupOutgoing
+
+
+
+
+
+
+
+
+
+
+ Prefs
+
+
+
+
+
+
+
+
+
+
+ FontSizeSettings
+
+
+
+
+
+
+
+
+
+
+ AccountSetupOptions
+
+
+
+
+
+
+
+
+
+
+ AccountSetupNames
+
+
+
+
+
+
+
+
+
+
+ AccountSetupComposition
+
+
+
+
+
+
+
+
+
+
+ AccountSetupCheckSettings
+
+
+
+
+
+
+
+
+
+
+ AccountSetupBasics
+
+
+
+
+
+
+
+
+
+
+ AccountSetupAccountType
+
+
+
+
+
+
+
+
+
+
+ FolderSettings
+
+
+
+
+
+
+
+
+
+
+ ChooseAccount
+
+
+
+
+
+
+
+
+
+
+ ChooseFolder
+
+
+
+
+
+
+
+
+
+
+ ChooseIdentity
+
+
+
+
+
+
+
+
+
+
+ EditIdentity
+
+
+
+
+
+
+
+
+
+
+ LauncherShortcuts
+
+
+
+
+
+
+
+
+
+
+ ManageIdentities
+
+
+
+
+
+
+
+
+
+
+ MessageCompose
+
+
+
+
+
+
+
+
+
+
+ Other Apps / OS
+
+
+
+
+
+
+
+
+
+
+ Search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/k9mail.iml b/k9mail.iml
index 1f9d13dd0..1d380b11c 100644
--- a/k9mail.iml
+++ b/k9mail.iml
@@ -19,6 +19,7 @@
+
@@ -28,7 +29,7 @@
-
+
@@ -77,6 +78,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/htmlcleaner-2.2-all.zip b/libs/htmlcleaner-2.2-all.zip
new file mode 100644
index 000000000..a20cedf53
Binary files /dev/null and b/libs/htmlcleaner-2.2-all.zip differ
diff --git a/libs/htmlcleaner-2.2.jar b/libs/htmlcleaner-2.2.jar
new file mode 100644
index 000000000..cc922d06b
Binary files /dev/null and b/libs/htmlcleaner-2.2.jar differ
diff --git a/proguard.cfg b/proguard.cfg
new file mode 100644
index 000000000..b1cdf17b5
--- /dev/null
+++ b/proguard.cfg
@@ -0,0 +1,40 @@
+-optimizationpasses 5
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-dontpreverify
+-verbose
+-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class com.android.vending.licensing.ILicensingService
+
+-keepclasseswithmembernames class * {
+ native ;
+}
+
+-keepclasseswithmembers class * {
+ public (android.content.Context, android.util.AttributeSet);
+}
+
+-keepclasseswithmembers class * {
+ public (android.content.Context, android.util.AttributeSet, int);
+}
+
+-keepclassmembers class * extends android.app.Activity {
+ public void *(android.view.View);
+}
+
+-keepclassmembers enum * {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+-keep class * implements android.os.Parcelable {
+ public static final android.os.Parcelable$Creator *;
+}
diff --git a/default.properties b/project.properties
similarity index 85%
rename from default.properties
rename to project.properties
index 528230532..213821e1f 100644
--- a/default.properties
+++ b/project.properties
@@ -1,15 +1,15 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
+#
# This file must be checked in Version Control Systems.
-#
+#
# To customize properties used by the Ant build system use,
-# "build.properties", and override values to adapt the script to your
+# "ant.properties", and override values to adapt the script to your
# project structure.
# Indicates whether an apk should be generated for each density.
split.density=false
+java.encoding=utf8
# Project target.
target=android-9
extensible.libs.classpath=compile-only-libs
-java.encoding=utf8
diff --git a/res/drawable-hdpi/ic_button_mark_read.png b/res/drawable-hdpi/ic_button_mark_read.png
old mode 100755
new mode 100644
diff --git a/res/drawable-hdpi/ic_button_mark_unread.png b/res/drawable-hdpi/ic_button_mark_unread.png
old mode 100755
new mode 100644
diff --git a/res/drawable-hdpi/ic_menu_identity.png b/res/drawable-hdpi/ic_menu_identity.png
old mode 100755
new mode 100644
diff --git a/res/drawable/button_indicator_prev.png b/res/drawable/button_indicator_prev.png
old mode 100755
new mode 100644
diff --git a/res/drawable/colorpicker_menjadi.png b/res/drawable/colorpicker_menjadi.png
old mode 100755
new mode 100644
diff --git a/res/drawable/ic_button_mark_read.png b/res/drawable/ic_button_mark_read.png
old mode 100755
new mode 100644
diff --git a/res/drawable/ic_button_mark_unread.png b/res/drawable/ic_button_mark_unread.png
old mode 100755
new mode 100644
diff --git a/res/drawable/ic_menu_identity.png b/res/drawable/ic_menu_identity.png
old mode 100755
new mode 100644
diff --git a/res/drawable/ic_menu_navigate.png b/res/drawable/ic_menu_navigate.png
old mode 100755
new mode 100644
diff --git a/res/drawable/ic_menu_reverse_sort.png b/res/drawable/ic_menu_reverse_sort.png
old mode 100755
new mode 100644
diff --git a/res/drawable/ic_menu_set_sort.png b/res/drawable/ic_menu_set_sort.png
old mode 100755
new mode 100644
diff --git a/res/drawable/icon.png b/res/drawable/icon.png
old mode 100755
new mode 100644
diff --git a/res/drawable/rounded_corners.xml b/res/drawable/rounded_corners.xml
new file mode 100644
index 000000000..73f1772ef
--- /dev/null
+++ b/res/drawable/rounded_corners.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/res/drawable/unread_count_background.xml b/res/drawable/unread_count_background.xml
new file mode 100644
index 000000000..d8504bd43
--- /dev/null
+++ b/res/drawable/unread_count_background.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/res/drawable/unread_widget_background.xml b/res/drawable/unread_widget_background.xml
new file mode 100644
index 000000000..52e295f83
--- /dev/null
+++ b/res/drawable/unread_widget_background.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout-land/message_list_item.xml b/res/layout-land/message_list_item.xml
index 4fb86a32c..fd7d98763 100644
--- a/res/layout-land/message_list_item.xml
+++ b/res/layout-land/message_list_item.xml
@@ -64,7 +64,7 @@
android:layout_toLeftOf="@+id/date" />
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/account_setup_incoming.xml b/res/layout/account_setup_incoming.xml
index 767fa28b2..2d8929c12 100644
--- a/res/layout/account_setup_incoming.xml
+++ b/res/layout/account_setup_incoming.xml
@@ -98,6 +98,11 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/launcher_shortcuts.xml b/res/layout/launcher_shortcuts.xml
deleted file mode 100644
index f05c883c1..000000000
--- a/res/layout/launcher_shortcuts.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
diff --git a/res/layout/unread_widget_layout.xml b/res/layout/unread_widget_layout.xml
new file mode 100644
index 000000000..4ad2c399e
--- /dev/null
+++ b/res/layout/unread_widget_layout.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/menu/accounts_context.xml b/res/menu/accounts_context.xml
index e55d13a94..9eb952915 100644
--- a/res/menu/accounts_context.xml
+++ b/res/menu/accounts_context.xml
@@ -21,6 +21,12 @@
android:title="@string/remove_account_action" />
+
+
+
diff --git a/res/menu/accounts_option.xml b/res/menu/accounts_option.xml
index 21b969c39..82ea3303f 100644
--- a/res/menu/accounts_option.xml
+++ b/res/menu/accounts_option.xml
@@ -35,4 +35,13 @@
android:title="@string/preferences_action"
android:icon="@android:drawable/ic_menu_preferences"
/>
+
+
+
diff --git a/res/menu/disabled_accounts_context.xml b/res/menu/disabled_accounts_context.xml
new file mode 100644
index 000000000..54d6c2afc
--- /dev/null
+++ b/res/menu/disabled_accounts_context.xml
@@ -0,0 +1,19 @@
+
+
+
diff --git a/res/menu/folder_list_option.xml b/res/menu/folder_list_option.xml
index 0e77995b1..6af522cfd 100644
--- a/res/menu/folder_list_option.xml
+++ b/res/menu/folder_list_option.xml
@@ -35,6 +35,11 @@
android:id="@+id/list_folders"
android:title="@string/refresh_folders_action"
android:icon="@drawable/ic_menu_refresh"
+ />
+
diff --git a/res/menu/folder_select_option.xml b/res/menu/folder_select_option.xml
index 968d6c113..8b9d7a240 100644
--- a/res/menu/folder_select_option.xml
+++ b/res/menu/folder_select_option.xml
@@ -31,6 +31,11 @@
android:title="@string/refresh_folders_action"
android:icon="@drawable/ic_menu_refresh"
/>
+
diff --git a/res/menu/message_compose_option.xml b/res/menu/message_compose_option.xml
index b2c9154d7..b2fb00c15 100644
--- a/res/menu/message_compose_option.xml
+++ b/res/menu/message_compose_option.xml
@@ -36,6 +36,11 @@
android:title="@string/send_as"
android:icon="@drawable/ic_menu_identity"
/>
+ Copyright 2008-%s The K-9 Dog Walkers. Porcions de Copyright 2006-%s Projecte de codi obert d\'Android.
Llicenciat sota Llicència Apache, Versió 2.0.Autors: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesInformació de la revisió: %s
- http://code.google.com/p/k9mail/Fem servir les següents biblioteques de tercers: %sIcones Emoji: %s
@@ -85,8 +83,6 @@
Esborra el compteSuprimeix totes les accions pendents (Compte!)
-
-
Comptes◀◀
@@ -112,6 +108,9 @@
Veu/amaga detallsAfegeix Cc/BccEdita assumpte
+
+
+
Afegeix adjuntAfegeix adjunt (Imatge)Afegeix adjunt (Vídeo)
@@ -267,11 +266,10 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
%s ha escrit:\n\nText citatHas d’afegir-hi, com a mínim, un destinatari.
-
+ No s\'ha trobat cap adreça de correu.Alguns adjunts no s’han carregat. Es carregaran automàticament abans no s’enviï aquest missatge.Alguns adjunts no es poden reenviar perquè no s’han carregat.
-
-
+
De: %s <%s>A:
@@ -291,7 +289,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Recollint l’adjunt.No ha estat capaç de trobar un visualitzador per %s.
-
Descarrega el missatge complet
@@ -318,7 +315,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Sobre %sVersió: %s
-
Mostra estelsEls estels indiquen els missatges senyalatsSelecció múltiple
@@ -338,6 +334,8 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Utilitza una amplada fixa de lletra quan es mostri missatges de text netTorna a la llista després esborrarTorna a la llista de missatges després esborrar missatges
+
+
Confirma accionsMostra un diàleg cada vegada que executis accions seleccionades
@@ -350,13 +348,11 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Bloca notificacionsNo mostris l’assumpte del missatge a la barra de notificacions quan el telèfon estigui blocat
-
Mode silenciósDeshabilita so de trucada, brunzit i llums durant la nitMode silenciós començaMode silenciós acaba
-
Configura un compte nouEntra l’adreça de correu d’aquest compte:(Pots afegir-hi %d més comptes.)
@@ -428,8 +424,8 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Quan s’està comprovantNomés manualment
+
Prefix del camí IMAP
- (Si és disponible, utilitza el NAMESPACE automàtic)Carpeta esborranysCarpeta enviats
@@ -519,7 +515,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
1000 missatgesTots els missatges
-
No es pot copiar o moure un missatge que no està sincronitzat amb el servidorNo s’ha pogut acabar la configuració
@@ -563,6 +558,9 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Tramesa correu
+
+
+
Contesta després del text citatQuan contestis, el missatge original apareixerà sobre de la contesta.
@@ -570,6 +568,9 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Text net (es trauran el format i les imatges)HTML (es conservaran el format i les imatges)
+
+
+
Contesta amb estil citaPrefix (com a Gmail, Pine)Capçalera (com a l’Outlook, Yahoo!, Hotmail)
@@ -593,7 +594,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Emmagatzematge
-
Color del compteTria el color del compte utilitzat a la llista de carpetes i de comptes
@@ -615,6 +615,8 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
512Kb1Mb2Mb
+
+
qualsevol mida (sense límit)Sincronitza des de
@@ -631,7 +633,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
els darrers 6 mesosel darrer any
-
Carpetes a mostrarTotNomés carpetes de 1a Classe
@@ -706,7 +707,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
LED faci pampalluguesQue el LED faci pampallugues quan arribi un correu
-
Configuració del servidorOpcions de composició del missatge
@@ -754,7 +754,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Tria compte/identitatEnvia com
-
Vés a la configuració del compte -> Gestiona identitats per crear identitatsNo pots esborrar una identitat si només en tens unaNo pots utilitzar una identitat sense una adreça de correu
@@ -796,8 +795,11 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
a la teva adreça i contrasenya correctes, pots no haver pagat
el compte \"Plus\". Si us plau, executeu el navegador d’Internet per obtenir accés a
aquests comptes de correu.
-
Si vols utilitzar POP3 per aquest proveïdor, hauries de permetre d’utilitzar POP3 a la pàgina de configuració del correu de Yahoo.
+
+
+
+
Certificat no reconegutAccepta la clau
@@ -826,8 +828,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Mostra carpetes de 1a i 2a ClasseMostra-ho tot excepte carpetes de 2a Classe
-
-
Posició de la signaturaAbans del text citatDesprés del text citat
@@ -850,8 +850,6 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
Controls zoom sistemaHabilita ginys de zoom or pica sobre el zoom si el teu aparell ho permet
-
-
Per defecte del sistemaSincronització 2n pla
@@ -1026,7 +1024,21 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
No esborrisConfirma moure\'l carpeta brossa
- Realment vols moure aquest missatge a la carpeta brossa?
+
+ Realment vols moure aquest missatge a la carpeta brossa?
+ Realment vols moure aquest missatge a la carpeta brossa?
+
+ SíNo
@@ -1038,9 +1050,55 @@ Benvingut a la configuració del K-9. El K-9 és un client de codi obert per An
›No es pot connectar.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Compte \"%s\" no és disponible; comprova emmagatzematgeDesa adjunts a...Desa adjuntNo s\'ha trobat l\'arxiu al navegador. On vols desar l\'adjunt?
+
+
+
+
+
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index feeb968e2..c2058ab41 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -11,9 +11,7 @@
Autoři: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesInformace o revizi: %s
- http://code.google.com/p/k9mail/
@@ -90,8 +88,6 @@
Odstranit účetVynulovat nevyřízené akce (nebezpečné!)
-
-
Účty◀◀
@@ -117,6 +113,9 @@
Zobrazit/skrýt podrobnostiPřidat kopii/skrytouUpravit předmět
+
+
+
Přidat přílohuPřidat přílohu (obrázek)Přidat přílohu (video)
@@ -276,8 +275,7 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Některé přílohy nebyly staženy. Budou staženy automaticky, než bude tato zpráva odeslána.Některé přílohy nelze přeposlat, protože ještě nebyly staženy.
-
-
+
Odesílatel: %s <%s>Komu:
@@ -297,7 +295,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Stahuji přílohu.Nelze nalézt prohlížeč pro %s.
-
Stáhnout úplnou zprávu
@@ -324,7 +321,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
O aplikaci%sVerze: %s
-
Zprávy s \u2605Hvězdička indikuje označenou zprávuVýběrová zaškrtávací pole
@@ -344,6 +340,8 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Použít písmo s pevnou šířkou při zobrazování textových zprávNávrat do seznamu po smazáníVrátit se do seznamu zpráv po smazání zprávy
+
+
Potvrzování akcíZobrazit dialog, když provádíte zvolené akce
@@ -356,13 +354,11 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Oznámení při zamčené obrazovceNezobrazovat v oznámení předmět zpráv, když je systém zamčen
-
Doba kliduZakázat v noci zvonění, vibrace a blikáníDoba klidu začínáDoba klidu končí
-
Založit nový účetZadejte emailovou adresu tohoto účtu:(Můžete ještě přidat %d účtů.)
@@ -434,8 +430,8 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Při dotazováníPouze ručně
+
Předpona cesty IMAP
- (Automaticky používat jmenný prostor, pokud je dostupný)Název složky KonceptyNázev složky Odeslaná
@@ -526,7 +522,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
1000 zprávvšechny zprávy
-
Nelze kopírovat nebo přesunovat zprávu, která není synchronizována se serveremKonfiguraci nastavení nelze dokončit
@@ -570,6 +565,9 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Odesílání zpráv
+
+
+
Odpovědět za citovaným textemPři odpovídání na zprávu se původní zpráva objeví ned vaší odpovědí.
@@ -577,6 +575,9 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
+
+
+
@@ -600,7 +601,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Úložiště
-
Barva účtuVyberte barvu účtu používanou v seznamech složek a zpráv
@@ -622,6 +622,8 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
512 KiB1 MiB2 MiB
+ 5 MiB
+ 10 MiBjakékoli velikosti (bez omezení)Synchronizovat odeslané zprávy
@@ -638,7 +640,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
za posledních 6 měsícůza poslední rok
-
Zobrazované složkyVšechnyJen složky 1. třídy
@@ -713,7 +714,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Blikání LEDBlikat LED, když přijde pošta
-
Nastavení serveruMožnosti tvorby nových zpráv
@@ -761,7 +761,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Vyberte účet/identituOdeslat jako
-
Vytvořte identity v Nastavení účtu -> Správa identitNemůžete odebrat vaši jedinou zbývající identituNemůžete použít identitu bez emailové adresy
@@ -803,8 +802,11 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
s vaší správnou emailovou adresou a heslem, nemusíte mít placený \"Plus\"
účet. Spusťte si prosím webový prohlížeč, kterým na takové účty získáte
přístup.
-
Pokud chcete používat POP3 s tímto poskytovatelem, měli byste povolit použití POP3 na stránce Nastavení pošty Yahoo.
+
+
+
+
Neznámý certifikátPřijmout klíč
@@ -833,8 +835,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Zobrazit složky 1. a 2. třídyZobrazit všechny vyjma složek 2. třídy
-
-
Umístění podpisuPřed citovanými zprávamiZa citovanými zprávami
@@ -857,8 +857,6 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Systémové ovládání zvětšováníPovolit zvětšovací doplňky nebo zvětšování štípnutím, pokud to zařízení podporuje
-
-
Systémový výchozíSynchronizace na pozadí
@@ -1033,7 +1031,20 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
Nemazat
-
+
@@ -1045,9 +1056,55 @@ Vítejte v nastavení pošty K-9 Mail. K-9 je open source poštovní klient pro
›Nelze se připojit.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
new file mode 100644
index 000000000..2848f173e
--- /dev/null
+++ b/res/values-da/strings.xml
@@ -0,0 +1,1111 @@
+
+
+ K-9 Mail
+ K-9 Mail BETA
+ Google, The K-9 Dog Walkers.
+ Copyright 2008-%s The K-9 Dog Walkers. Visse dele Copyright 2006-%s the Android Open Source Project.
+ Licenseret under the Apache License, Version 2.0.
+ <p>HtmlCleaner is distributed under BSD License. It gives the freedom for anyone to use, explore, modify, and distribute HtmlCleaner, but without any warranty.</p><p>Copyright (c) 2006-2011, HtmlCleaner team.<br>All rights reserved.</p><p>Redistribution and use of this software in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p><p><ul><li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li><li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li><li>The name of HtmlCleaner may not be used to endorse or promote products derived from this software without specific prior written permission.</li></ul></p><p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+ Ophavsmænd: %s
+ Revisions information: %s
+ Vi anvender følgende 3je parts biblioteker: %s
+ Emoji ikoner: %s
+
+ Læs mail vedhæftninger
+ Tillad dette program at læse dine vedhæftede filer.
+ Læs mails
+ Tillad dette program at læse dine mails.
+ Slet mails
+ Tillad dette program at slette dine mails.
+
+ Om %s
+ Konti
+ Advanceret
+ %s
+ K-9 Konti
+
+ %s:%s
+
+ Skriv
+ Fejlsøg
+ Vælg en mappe
+ Vælg en farve
+
+ %s%s%s
+
+ \u0020[%d]
+ \u0020(Synkroniserer %s:%s%s)
+ \u0020(Henter headers %s:%s%s)
+ \u0020(Sender %s%s)
+ \u0020(Behandler %s:%s%s)
+ \u0020%s/%s
+
+ \u0020(Næste synkronisering @ %s)
+ \u0020(synkronisering deaktiveret)
+
+
+ Næste
+ Forrige
+ OK
+ Fortryd
+ Send
+ Send igen
+ Vælg
+ Fravælg
+ Svar
+ Svar alle
+ Slet
+ Arkiver
+ Spam
+ Tøm mappe
+ Videresend
+ Flyt
+ Fortsæt
+ Afslut
+ Fjern
+ Slet
+ Gem som kladde
+ Forsøg igen
+ Genindlæs
+ Synkroniser mails
+ Send mails
+ Mappeliste
+ Genindlæs mapper
+ Marker alle mails som læst
+ Tilføj konto
+ Skriv
+ Søg
+ Søgeresultater
+ Indstillinger
+ Åbn
+ Konto indstillinger
+ Mappe indstillinger
+ Globale indstillinger
+ Slet konto
+ Afbryd igangværende handlinger (farligt!)
+
+ Konti
+ ◀
+ ◀
+ Læs
+ Marker som læst
+ Del
+ Vælg afsender
+
+ Marker alle mails som læst
+ Marker alle mails i \'%s\' som læst? (incl.
+ mails i mappe som ikke er vist i K-9)
+
+ Tilføj stjernemarkering
+ Fjern stjernemarkering
+ Kopier
+ Vis hele headeren
+ Skjul header
+ Vælg tekst
+
+ Marker som ulæst
+ Flyt til
+ Mapper
+ Vis/skjul detaljer
+ Tilføj Cc/Bcc
+ Rediger emne
+ Kvittering for modtagelse
+ Der vil blive anmodet om kvittering for modtagelse
+ Der vil ikke blive anmodet om kvittering for modtagelse
+ Vedhæft fil
+ Vedhæft (billede)
+ Vedhæft (Video)
+ Dump indstillinger
+ Tøm papirkurv
+ Ryd helt
+ Fjern lokalt lagrede mails
+ Vælg sortering
+ Omvendt sortering
+ Om
+
+ Indstillinger
+ Kontoindstillinger
+ Mappeindstillinger
+
+ (Intet emne)
+ Ingen dato
+ Ingen afsender
+ Synkroniserer
+ (Synkroniserer %s%s)
+ Henter mails\u2026
+ Tilslutningsfejl
+ Mail ikke fundet
+ Fejl
+ Sender
+
+ Forsøg at hente flere mails igen
+
+ Hent yderligere op
+ til %d mails
+
+ GB
+ MB
+ KB
+ B
+
+
+ Konto \"%s\" nedbragt fra
+ %s
+ til
+ %s
+
+
+ Komprimerer konto \"%s\"
+ Renser konto \"%s\"
+ Genskaber konto \"%s\"
+
+ Ny mail
+ Ny mail fra %s
+ %d ulæst(e) (%s)
+ %d ny(e) mail(s) (%s)
+ in %d konti
+ Mail blev ikke sendt
+
+ Synkroniserer mail: %s:%s
+ Synkroniserer mail
+ Sender mail: %s
+ Sender mail
+ :
+
+ Indbakke
+ Udbakke
+
+ Kladder
+ Slettede
+ Sendt
+ Arkiv
+ Spam
+
+
+ %s (Kladder)
+ %s (Slettede)
+ %s (Sent)
+ %s (Arkiv)
+ %s (Spam)
+
+ Mislykkedes med at sende nogle mails
+ Se mappen %s for detaljer.
+ K-9 havde et problem med at sende nogle af dine mails.
+ Typen af fejl gør at K-9 ikke kan afgøre om disse mails blev sendt
+ eller ej. Modtagerne har muligvis allerede modtaget kopi af mail(s).
+ \u000a\u000aDe mails som er berørt af denne fejl, er blevet markeret med stjerne i din udbakke.
+ Hvis du fjerner stjernemarkering, vil K-9 forsøge at sende mailen igen.
+ Langt-tryk på udbakket og klik på \"Send mail\" for at initiere et nyt forsøg på at sende.\u000A\u000a
+ Mappen %s kan evt indeholde fejlmeddelelser vedrørende problemet.
+
+ K-9 advarsel
+ Synkronisering og afsendelse er afbrudt pga. manglende netværksforbindelse.
+
+ Ikke flere mails
+
+
+Velkommen til K-9 Mail opsætning. K-9 er en open source mail klient for Android, som oprindeligt baserede sig på standard mail klienten i Android.
+\n
+\n\nK-9\'s forbedrede funktioner inkluderer:
+\n * Push mail ved hjælp af IMAP IDLE
+\n * Bedre performance
+\n * Omflytning af mails
+\n * Mailsignaturer
+\n * Bcc til dig selv
+\n * Mappe subscriptions
+\n * Synkronisering af alle mapper
+\n * Indstil afsender-adresse
+\n * Tastatur genveje
+\n * Bedre IMAP understøttelse
+\n * Gem vedhæftninger til SD kort
+\n * Tøm papirkurv
+\n * Sortering af mails
+\n * ...og mere
+\n
+\nBemærk at K-9 ikke understøtter gratis hotmail konti, og at K-9 (som de fleste andre mailklienter) har visse problemer med at kommunikerer med Microsoft Exchange.
+\n
+\n Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål til http://k9mail.googlecode.com/
+
+
+
+ Version: %s
+ Aktiver fejllogning
+ Log ekstra diagnostik information
+ Log sensitiv information
+ Kan eksponere passwords i logs.
+
+ K-9 Mail for Android
+
+ Alle mails
+ Nye mails fra alle konti
+ Indbakke med alle nye mails
+
+ %s:%s
+ %s
+ %s
+ %s
+ %s
+ Hent flere mails
+ Til:%s
+ Slet
+ Marker som læst
+ Marker som ulæst
+ Tilføj stjernemarkering
+ Fjern stjernemarkering
+
+ Til
+ Cc
+ Bcc
+ Emne
+ Meddelelsestekst
+ -------- Original meddelelse --------
+ Emne:
+ Sendt:
+ Fra:
+ Til:
+ Cc:
+ %s skrev:\n\n
+ Citeret tekst
+ Du skal angive mindst én modtager.
+ Mail addresse ikke fundet.
+ Nogle vedhæftninger blev ikke hentet. De vil blive hentet automatisk før denne mail bliver sendt.
+ Nogle vedhæftninger kunne ikke videresendes fordi de ikke er blevet hentet fra server.
+ Citer meddelelse
+
+ Fra: %s <%s>
+ Til:
+ Cc:
+ Åben
+ Gem
+ \u25BC
+ \u25B2
+ Arkiver
+ Flyt
+ Spam
+ dd MMM yyyy hh:mm a
+ Vedhæftning gemt på SD kort som %s.
+ Kan ikke gemme vedhæftning på SD kort.
+ vælg \"Vis billeder\" for at se billeder.
+ Vis billeder
+ Henter vedhæftede filer.
+ Kan ikke finde program som kan vise %s.
+
+ Hent hele meddelelsen
+
+
+ Ikke alle mail headers blev hentet eller gemt. Vælg \"Gem alle headers lokalt\" under kontoens indstillinger for indgående server, for at aktivere denne funktion fremover.
+ Alle mail headers er blevet hentet, og der kan ikke vises yderligere headers.
+ Hentning af yderligere headers fra database eller mail server mislykkedes.
+
+ Mapper
+ Ny mappe
+
+ Navn på ny mappe
+
+ (Push)
+
+ Flere fra denne afsender
+
+ Mail kopieret
+ Mail flyttet
+ Mail slettet
+ Mail kasseret
+ Mail gemt som kladde
+ Kunne ikke slette mail
+
+ Om %s
+ Version: %s
+
+ Vis stjerner
+ Stjerne indikerer mails med flag
+ Checkbokse for multible valg
+ Vis altid checkbokse for multible valg
+ Touch venlig visning
+ Rummeligere listning i forhåndsvisning
+ Linier i forhåndsvisning
+ Vis afsenders navne
+ Vis afsendernavn fremfor deres mailaddresse
+ Vis kontaktnavne
+ Benyt afsendernavne fra eksisterende kontakter
+ Farvelæg kontakter
+ Benyt ikke farvelægning af navne i kontaktlisten
+ Farvelæg navne i kontaklisten
+
+ Tegnsæt med fast bredde
+ Benyt tegnsæt med fast bredde til visning af mails med ren tekst
+ Retur til liste efter sletning
+ Returner til mailliste efter sletning af mail
+ Vis næste mail efter sletning
+ Vis som standard næste mail efter sletning af mail
+
+ Bekræft handlinger
+ Vis dialogvindue når du udfører valgte handlinger
+ Arkiver
+ Slet mail (kun i forb. med visning af mails)
+ Slet stjernemarkeringer (kun i forb. med visning af mails)
+ Spam
+ Marker alle som læst
+ Send
+
+ Meddelelse på låst skærm
+ Vis ikke mailens emne i telefonens statuslinie når systemet er låst
+
+ Tidsrum med stilhed
+ Undlad at ringe, vibrere og blinke i tidsrummet
+ Start tid
+ Slut tid
+
+ Opsætning af ny konto
+ Indtast denne konto\'s mail-addresse:
+ (Du kan tilføje yderligere %d konti.)
+ Mail addresse
+ %s er ikke en valid email addresse.
+ %s er allerede tilføjet.
+ Password
+ Send mail fra denne konto som standard
+ Manuel opsætning
+
+
+ Henter konto-information\u2026
+ Kontrollerer indstillinger for indgående server\u2026
+ Kontrollerer indstillinger for udgående server\u2026
+ Autentiserer\u2026
+ Henter kontoindstillinger\u2026
+ Afslutter\u2026
+ Afbryder\u2026
+
+ Næsten færdig!
+ Din konto er nu konfigureret, og mails er på vej!
+ Giv denne konto et navn (frivilligt):
+ Indtast dit navn (vises på udgående mails):
+
+ Din konto er nu konfigureret!\n\nHenter mails\u2026
+
+ Kontotype
+ Hvilken type konto er dette?
+ POP3
+ IMAP
+ Exchange (WebDAV)
+
+ Indgående server opsætning
+ Brugernavn
+ Password
+ POP3 server
+ IMAP server
+ Exchange server
+ Port
+ Sikkerhed
+ Autentifikations type
+ Ingen
+ SSL (hvis tilgængelig)
+ SSL (altid)
+ TLS (hvis tilgængelig)
+ TLS (altid)
+
+ Når jeg sletter en mail
+ Undlad at slette på server
+ Efter 7 dage
+ Slet på server
+ Marker som læst på server
+
+ Anvend kompression på netværket:
+ Mobilt netværk
+ Wi-Fi
+ Andet
+
+ Hentning af mail headers
+ Gem alle mail headers lokalt
+
+ Eksternt lager (SD kort)
+ Almindelig internt lager
+ %1$s yderligere internt lager
+ Placering af lager
+
+ Ryd slettede mails
+ Umiddelbart efter sletning
+ I forbindelse med hentning af mails
+ Kun manuelt
+
+
+ IMAP søge prefix
+
+ Navn på Kladde mappe
+ Navn på Sendt mappen
+ Navn på Slettet mappen
+ Navn på Arkiv mappen
+ Navn på Spam mappen
+
+ Vis kun mapper du abonerer på
+ Udvid mapper automatisk
+
+ Sti til WebDav (Exchange)
+ Frivilligt
+
+ Sti til autentifikation
+ Frivilligt
+ Sti til mailboks (alias)
+ Frivilligt
+
+ Udgående server indstillinger
+ SMTP server
+ Port
+ Sikkerhedstype
+ Aldrig
+ SSL
+ TLS (hvis tilgængeligt)
+ TLS (altid)
+ Kræv login.
+ Brugernavn
+ Password
+ Autentifikationstype
+
+ Brugernavn & password
+ Brugernavn
+ Password
+ POP før SMTP
+ IMAP før SMTP
+ WebDAV (Exchange) før SMTP
+
+ Ugyldig opsætning: %s
+
+ Kontoindstillinger
+
+ Komprimer
+ Ryd mails (farligt!)
+ Genskab data (sidste udvej!)
+
+ Frekvens for hentning af mail
+
+ Aldrig
+ Hvert minut
+ Hver 5 minut
+ Hver 10 minut
+ Hver 15 minut
+ Hver 30 minut
+ Hver time
+ Hver 2 time
+ Hver 3 time
+ Hver 6 time
+ Hver 12 time
+ Hver 24 time
+
+ Hent mail i forbindelse med afsendelse af mail
+ Aktiver push-mail for denne konto
+ Hvis din server understøtter dette, vil nye mails blive leveret øjeblikkeligt. Denne indstilling kan både indebære forbedret og forringet performance.
+ Forny IDLE forbindelse
+ Hvert minut
+ Hver 2 minut
+ Hver 3 minut
+ Hver 6 minut
+ Hver 12 minut
+ Hver 24 minut
+ Hver 36 minut
+ Hver 48 minut
+ Hver 60 minut
+
+ Send mail fra denne konto som standard
+ Vis meddelelse når mails ankommer
+ Vis meddelelse når mail hentes
+
+
+ Antal viste mails
+ 10 mails
+ 25 mails
+ 50 mails
+ 100 mails
+ 250 mails
+ 500 mails
+ 1000 mails
+ alle mails
+
+ Kan ikke kopiere eller flytte mail som ikke er synkroniseret med server
+
+ Kunne ikke fuldføre opsætning
+ Brugernavn eller password ukorrekt.\n(%s)
+ Kan ikke oprette sikker forbindelse til server.\n(%s)
+ Kan ikke oprette forbindelse til server.\n(%s)
+ Rediger detaljer
+ Fortsæt
+
+ Avanceret
+ Kontoindstillinger
+ Standard konto
+ Standard konto
+ Send mail fra denne konto som standard
+ Vis besked når ny mail er modtaget
+ Synkroniser statusbar
+ Din mailaddresse
+ Vis besked i statusbar når mail ankommer
+ Vis i statusbar mens mail hentes
+ Vis kombineret indbakke
+ Medtag udgående mails
+ Vis besked for mails sendt af mig
+ Klik på besked, viser ulæste mails
+ Søger efter ulæste mails når besked vises
+ Vis antal ulæste mails
+ Vis antallet af ulæste mails i statusbar.
+
+ Scroll navigations knapper
+ Aldrig
+ Når tastatur er tilgængeligt
+ Altid
+
+ Aktiver Flyt knapper
+ Vis Arkiver, Flyt og Spam knapper.
+ Scroll Flyt knapper
+
+ Vis altid billeder
+ Aldrig
+ Kun når afsender findes i Kontakter
+ Fra alle
+
+ Skriv mail
+
+ Medtag den originale meddelelse i svar
+ Når du sender svar på mail, vil den oprindelige tekst blive medtaget
+
+ Svar placeres efter citeret tekst
+ Når du sender svar på mail, vil den oprindelige tekst blive placeret oven over dit svar
+
+ Fjern signatur fra citeret svar
+ Når du sender svar på mail, vil evt. signatur i citeret tekst blive fjernet
+
+ Meddelelses format
+ Ren tekst (billeder og formattering vil blive fjernet)
+ HTML (billeder og formattering bevares)
+ Automatisk (ren tekst med mindre mail som besvares er i HTML format)
+
+ Kvittering for modtagelse
+ Anmod altid om kvittering for modtagelse
+
+ Citationsstil ved svar
+ Prefix (som Gmail, Pine)
+ Header (som Outlook, Yahoo!, Hotmail)
+
+ Generelt
+ Visning
+ Hentning af mail
+ Mapper
+ Listning af mails
+ Visning af meddelelser
+ Citeret tekst prefix
+ Kryptering
+ OpenPGP leverandør
+ Ingen
+ ikke tilgængelig
+ Auto signering
+ Benyt kontoens mail addresse til at gætte signaturnøgle.
+
+ Frekvens for hentning af mails
+ Frekvens for hentning af sekundære mapper
+
+ Lagring
+
+ Kontofarve
+ Vælg en farve til konto (benyttes ved mappevisning og listning af konti)
+
+ Notification LED farve
+ Vælg den farve som din telefonens LED skal benytte for denne konto
+
+ Lokal mappestørrelse
+
+ Hent automatisk mail hvis indhold fylder op til
+ 1Kb
+ 2Kb
+ 4Kb
+ 8Kb
+ 16Kb
+ 32Kb
+ 64Kb
+ 128Kb
+ 256Kb
+ 512Kb
+ 1Mb
+ 2Mb
+ 5Mb
+ 10Mb
+ Ubegrænset størrelse
+
+ Synkroniser mails fra
+ Ethvert tidspunkt (ubegænset)
+ i dag
+ de seneste 2 dage
+ de seneste 3 dage
+ den seneste uge
+ de seneste 2 uger
+ de seneste 3 uger
+ den seneste måned
+ de seneste 2 måneder
+ de seneste 3 måneder
+ de seneste 6 måneder
+ det seneste år
+
+ Mapper som ønskes vist
+ Alle
+ Kun primære mapper
+ Primære og sekundære mapper
+ Alle pånær sekundære mapper
+
+ Hent/send mail fra mapper (Sync)
+ Alle
+ Kun primære mapper
+ Primære og sekundære mapper
+ Alle pånær sekundære mapper
+ Ingen
+
+ Hent/send mail fra mapper(Push)
+ Alle
+ Kun primære mapper
+ Primære og sekundære mapper
+ Alle på nær sekundære mapper
+ None
+
+ Flyt/kopier destinations mapper
+ Alle
+ Kun primære mapper
+ Primære og sekundære mapper
+ Alle pånær sekundære mapper
+
+ Synkroniser fjern-sletning
+ Fjern mails når de slettes på server
+
+ Mappe indstillinger
+
+ Vis i topgruppen
+ Vis nær toppen af mappelisten
+
+ Mappeklasse for visning
+ Ingen
+ Primær
+ Sekundær
+
+ Mappeklasse for synkronisering
+ Ingen
+ Primær
+ Sekundær
+ Samme som visnings-klasse
+
+ Mappeklasse for push mail
+ Ingen
+ Primær
+ Sekundær
+ Samme som synkroniserings klasse
+
+ Indgående server
+ Konfigurer indgående mail server
+ Udgående server
+ Konfigurer udgående mail (SMTP) server
+ Tilføj en anden konto
+ Kontonavn
+ Dit navn
+ Notifikationer
+ Ringetone når mail ankommer
+ Vibrer
+ Vibrer når mail ankommer
+ Vibrations mønstre
+ default
+ mønster 1
+ mønster 2
+ mønster 3
+ mønster 4
+ mønster 5
+ Gentag vibration
+ Ringetone ved ny mail
+ Blinkende LED
+ Blinkende LED når mail ankommer
+
+ Serverindstillinger
+
+ Indstillinger for skrivning af mail
+ Standardindstillinger
+ Standardindstilling for afsender, Bcc og signatur
+
+ Håndter identiteter
+ Opsæt alternativ afsender-addresse og signatur
+
+ Håndter identiteter
+
+ Håndter identitet
+
+ Rediger identitet
+ Ny identitet
+
+ Send altid Bcc til
+ Send kopi af alle udgående mails til denne addresse
+
+ Rediger
+ Flyt op
+ Flyt ned
+ Flyt til top og vælg som standard
+ Fjern
+
+ Beskrivelse af identitet
+ (Frivilligt)
+ Dit navn
+ (Frivilligt)
+ Mail-addresse
+ (Påkrævet)
+ Svar-til-addresse
+ (Frivilligt)
+ Signatur
+ (Frivilligt)
+
+ Benyt signatur
+ Signatur
+ Tilføj signature til alle mails jeg sender
+
+ -- \nSendt fra min Android telefon med K-9 Mail. Undskyld hvis jeg er lidt kortfattet.
+ Oprindelige identitet
+ Vælg identitet
+ Vælg identitet
+ Vælg konto/identitet
+ Send som
+
+ Gå til konto-indstillinger -> Håndter identiteter for at skabe en identitet
+ Du kan ikke slette din eneste identitet
+ Du kan ikke benytte en identitet uden mailaddresse
+ Dit valg af identitet og ændringer i signatur, vil ikke blive gemt i kladde
+
+ Ældste mails ført
+ Nyeste mails først
+ Sorter efter afsender
+ Sorter after afsender omvendt alfabetisk
+ Sorter efter emne
+ Sorter efter emne omvendt alfabetisk
+ Stjernemarkerede mails først
+ Ikke stjernemarkerede mails først
+ Ulæste mails først
+ Læste mails først
+ Mail med vedhæftede filer først
+ Mail uden vedhæftede filer først
+
+ Sorter efter...
+ Dato
+ Afsender
+ Emne
+ Stjernemarkering
+ Læst/ulæst
+ Vedhæftning
+ %s
+
+ Fjern konto
+ Kontoen \"%s\" vil blive fjernet fra K-9 Mail.
+
+ Nulstil konto
+ Alle mails, vedhæftede filer, mapper og mappe-indstillinger for \"%s\" vil blive fjernet fra K-9 Mail, men kontoindstillinger vil blive husket.
+
+ Rens konto
+ Alle mails i \"%s\" vil blive fjernet, men kontoindstillinger vil blive husket.
+
+ Kun visse \"Plus\" konti tillader adgang via POP
+ som er nødvendig for at kunne tilgå konto. Hvis du ikke kan logge ind på trods af
+ korrekt mail addresse og password, kan det skyldes at du ikke har
+ \"Plus\" konto. Benyt venligst en Internet browser til disse konti.
+
+ Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade POP3 i Yahoo\'s indstillinger for mail.
+ Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade IMAP eller POP3 i Naver\'s indstillinger for mail.
+ Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade IMAP eller POP3 i Hanmail\'s(Daum)indstillinger for mail.
+ Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade IMAP eller POP3 i Paran\'s indstillinger for mail.
+ Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade IMAP eller POP3 i Nate\'s indstillinger for mail.
+
+ Ukendt certificat
+ Accepter nøgle
+ Afvis nøgle
+
+ Del (or D) - Slet\u000AR -
+ Svar\u000AA - Svar alle\u000AF - Videresend\u000AJ or P - Foregående
+ mail\u000AK, N - Næste mail\u000AM - Flyt\u000AY - Kopier\u000AZ - Zoom ud\u000AShift-Z -
+ Zoom ind\u000aG - Stjerne
+ Del (or D) - Slet\u000AR -
+ Svar\u000AA - Svar alle\u000AC - Skriv\u000AF - Videresend\u000aM -
+ Flyt\u000AY - Kopier\u000AG - Stjerne\u000AO - Sorteringstype\u000AI - Sorteringsorden\u000AQ
+ - Returner til Mapper\u000AS - Vælg/fravælg
+
+
+ 1 - Vis kun primære mapper\u000A
+ 2 - Vis primære og sekundære mapper\u000A
+ 3 - Vis alle pånær sekundære mapper\u000A
+ 4 - Vis alle mapper\u000A
+ Q - Returner til Konti\u000A
+ S - Rediger kontoindstillinger
+
+ Mapper
+ Vis alle mapper
+ Vis kun primære mapper
+ Vis primære og sekundære mapper
+ Vis alle pånær sekundære mapper
+
+ Signatur position
+ Før citeret tekst
+ Efter citeret tekst
+ Mørk
+ Lys
+ Visning
+ Globalt
+ Fejlsøgning
+ Privatliv
+ Netværk
+ Interaktion
+ Kontoliste
+ Mailliste
+ Mails
+ Tema
+ Sprog
+
+ Enkelkolonne layout
+ Reformater HTML meddelelser til visning på små skærme
+ Zoom kontrol
+ Aktiver zoom widgets eller pinch-zoom hvis din enhed understøtter dette
+
+ System standard
+
+ Baggrundssynkronisering
+ Aldrig
+ Altid
+ Når \"Baggrundsdata\" er aktiveret
+ Når \"Baggrundsdata\" & \"Auto-sync\" er aktiveret
+
+ Ingen mail valgt
+
+ Datoformat
+
+ SHORT
+ MEDIUM
+ dd-MMM-yyyy
+ yyyy-MM-dd
+
+ Batch operationer
+ Slet valgte
+ Marker valgte som læst
+ Marker valgte som ulæst
+ Tilføj stjerne til valgte
+ Fjern stjerne fra valgte
+ Flyt valgte til arkiv
+ Flyt valgte til mappen Spam
+ Flyt valgte
+ Kopier valgte
+ Stjerne tilstand
+ Vælg tilstand
+ Standard tilstand
+ Vælg alle
+ Fravælg alle
+
+ Max antal mapper som skal kontrolleres ved push
+ 10 mapper
+ 25 mapper
+ 50 mapper
+ 100 mapper
+ 250 mapper
+ 500 mapper
+ 1000 mapper
+
+ Animation
+ Anvend visuelle effekter
+ Gestures
+ Benyt gesture kontrol
+
+ Kompakt layout
+ Juster layout så der vises mere på hver side
+
+ Volume-knap navigation
+ Skift mellem valg vha. volume-knapper
+ Mail-visning
+ Diverse listevisninger
+
+ Håndter \"Tilbageknap\"
+ \"Tilbageknap\" går altid et niveau op
+
+ Start i fælles indbakke
+ Vis indhold af fælles indbakke ved opstart
+
+ Vis størrelse på konto
+ Deaktiver for hurtigere visning
+
+ Optæl søgeresultat
+ Deaktiver for hurtigere visning
+
+ Skjul specialkonti
+ Skjul fælles indbakke og fælles mailkonti
+
+ %s%s
+ - Stjernemarkerede
+ - Ulæste
+
+ Alle mails
+ Alle mails i søgbare mapper
+
+ Fælles indbakke
+ Alle mails i fælles mapper
+
+ Klip på konvolut eller stjerne for ulæste eller stjernemarkerede mails
+
+ Inkluder i fælles indbakke
+ Alle mails vises i fælles indbakke
+
+ Søgbare mapper
+ Alle
+ Viste
+ Ingen
+
+ K-9 Mail fjernkontrol
+ Tillad dette program at kontrollere K-9 Mail aktiviteter og indstillinger.
+
+ Tegnstørrelse
+ Konfigurer tegnstørrelse
+
+ Kontoliste
+ Kontonavn
+ Kontobeskrivelse
+
+ Mappeliste
+ Mappenavn
+ Mappestatus
+
+ Mailliste
+ Emne
+ Afsender
+ Dato
+ Forhåndsvisning
+
+ Meddelelse
+ Afsender
+ Modtagere (Til)
+ Modtagere (Cc)
+ Yderligere headers
+ Emne
+ Tid
+ Dato
+ Indhold
+
+ Mindst
+ Mindre
+ Lille
+ Medium
+ Stor
+ Større
+ Størst
+
+ Minst
+ Lillle
+ Normal
+ Større
+ Størst
+
+
+ Kontroller \"Indstillinger\" -> \"Benyt Gallery bug work-around\" for at kunne vedhæfte billeder og videoer med Gallery 3D.
+
+
+ Benyt \"Tilføj vedhæft (billede)\" eller \"Tilføj vedhæftning (video)\" for at kunne vedhæfte billeder eller videoer med Gallery 3D.
+
+ Diverse
+ Benyt Gallery bug work-around
+ Vis knapper til vedhæftning af billede/video (måde at omgå fejl i Gallery 3D)
+
+
+ Kunne ikke finde noget program som kan udføre denne handling.
+ Den installerede version af APG understørttes ikke.
+ Signer
+ Krypter
+ Dekrypter
+ Verificer
+ <ukendt>
+ id: %s
+ K-9 har ikke tilstrækkelig tilladelse til at benytte APG, geninstaller K-9 for at give fuld adgang.
+ PGP/MIME meddelelser er ikke understøttet endnu.
+ Advarsel: vedhæftninger er IKKE signerede eller krypterede endnu.
+ Send afbrudt.
+
+ Gem kladde?
+ Gem eller fortryd denne meddelelse?
+
+ Denne meddelelse kan ikke vises fordi tegnsættet \"%s\" ikke blev fundet.
+
+ Vælg tekst som skal kopieres.
+
+ Bekræft sletning
+ Ønsker du at slette denne mail?
+ Slet
+ Slet ikke
+
+ Bekræft flytning til spam mappe
+
+ Ønsker du virkelig at flytte denne meddelelse til spam mappen?
+ Ønsker du virkelig at flytte %1$d meddelelser til spam mappen?
+
+
+ Ja
+ Nej
+
+ Henter vedhæftning
+
+ Fejllogning til Android logsystem aktiveret
+
+ »
+ ›
+ Kunne ikke opnå forbindelse.
+
+ Import & eksport af indstillinger
+ Eksporter kontoindstillinger
+ Eksporter indstillinger og konti
+ Importer
+ Eksporter
+ Importer indstillinger
+ Importer det valgte
+ Globale indstillinger
+ Ekporterer indstillinger...
+ Importerer indstillinger...
+ Skanner fil...
+ Indstillinger gemt som %s
+ Importerede globale indstillinger fra %s
+ Importerede %s fra %s
+
+ 1 konto
+ %s konti
+
+ Eksport af indstillinger fejlede
+ Kunne ikke importere indstillinger fra %s
+ Eksport succes
+ Eksport fejlede
+ Import succes
+ Import fejlede
+ Aktiver konto
+ Hvis du skal kunne benytte konto \"%s\" er du nødt til at angive %s.
+
+ server password
+ server passwords
+
+ Indgående server (%s):
+ Udgående server (%s):
+
+ Angiver password...
+ Angiver passwords...
+
+ Benyt samme password som benyttes til indgående server
+ Aktiver
+
+ Kunne ikke håndtere fil fra version %s
+
+ Konto \"%s\" kunne ikke findes; kontroller lager
+
+ Gem vedhæftning ...
+ Gem vedhæftning
+ Kunne ikke finde en Stifinder. Hvor ønsker du gemme denne vedhæftning?
+
+ Flyt op
+ Flyt ned
+ Flytter konto...
+
+
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 16f6b4c40..c502c09b3 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -6,9 +6,7 @@
Lizensiert unter der Apache License, Version 2.0.Autoren: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesVersionsinformationen: %s
- http://code.google.com/p/k9mail/Wir benutzen die folgenden externen Bibliotheken: %sEmoji Bilder: %s
@@ -62,6 +60,7 @@
WeiterleitenVerschiebenFortfahren
+ ZurückFertigEntfernenVerwerfen
@@ -72,6 +71,7 @@
Nachricht sendenOrdnerlisteOrdnerliste aktualisieren
+ Finde OrdnerAlle als gelesen markierenKonto hinzufügenVerfassen
@@ -85,8 +85,6 @@
Konto entfernenAusstehende Aktionen abbrechen (Warnung!)
-
-
Konten◀◀
@@ -111,6 +109,9 @@
Details anzeigen/verbergenCC/BCC hinzufügenBetreff bearbeiten
+ Empfangsbestätigung
+ Eine Empfangsbestätigung wird angefordert.
+ Es wird keine Empfangsbestätigung angefordert.Anhang hinzufügenAnhang hinzufügen (Bild)Anhang hinzufügen (Video)
@@ -257,18 +258,17 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Nachrichtentext-------- Original-Nachricht --------Betreff:
- Versendet am:
+ Gesendet:Von:An:CC:\n\n%s schrieb:\n\nZitierter TextSie müssen mindestens einen Empfänger wählen.
-
+ Es wurde keine E-Mail-Adresse für diesen Kontakt gefunden.Einige Anhänge wurden nicht heruntergeladen. Sie werden automatisch heruntergeladen, bevor diese Nachricht gesendet wird.Einige Anhänge können nicht weitergeleitet werden, da diese nicht heruntergeladen wurden.
-
-
+ Original-Nachricht zitierenVon: %s <%s>An:
@@ -277,7 +277,7 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Speichern\u25BC\u25B2
- Sichern
+ ArchivierenVerschiebenSpamdd. MMM yyyy HH:mm
@@ -288,7 +288,6 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Lade Anhang.Es wurde kein Anzeigeprogramm für %s gefunden.
-
Gesamte Nachricht herunterladen
@@ -315,7 +314,6 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Über %sVersion: %s
-
Wichtige NachrichtenSterne weisen auf wichtige Nachrichten hin.Mehrfachauswahl
@@ -335,11 +333,14 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Verwende Schriftart mit gleicher Zeichenbreite für Plain-Text NachrichtenNach Löschen zurückNach Löschen zur Nachrichtenliste zurückkehren
+ Nach Löschen nächste Nachricht
+ Nach Löschen standardmäßig die nächste Nachricht anzeigenBestätigungsdialogVerlange Bestätigung bei gewissen AktionenArchivierenLöschen (nur in Nachrichtenansicht)
+ Sternmarkierte Löschen (nur in Nachrichtenansicht)SpamAlle als gelesen markierenSenden
@@ -347,13 +348,11 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Vertrauliche BenachrichtigungDer Betreff der Nachricht wird nicht in der Benachrichtigungszeile angezeigt
-
RuhezeitDeaktivere Klingeln, Vibrieren und Leuchten in der NachtRuhezeit startetRuhezeit endet
-
E-Mail-Konto einrichtenE-Mail-Adresse Ihres Kontos:(Sie können %d weitere Konten hinzufügen.)
@@ -425,8 +424,8 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Bei jedem AbrufenNur manuell
+ IMAP Namensraum automatisch ermittelnIMAP-Verzeichnispräfix
- (Automatisch mit Hilfe von NAMESPACE falls verfügbar)Ordner für EntwürfeOrdner für gesendete Objekte
@@ -517,7 +516,6 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
1000 Nachrichtenalle Nachrichten
-
Nachrichten, die nicht mit dem Server synchronisiert wurden, können nicht kopiert oder verschoben werden.Setup konnte nicht abgeschlossen werden
@@ -551,7 +549,7 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
ImmerSpam-Leiste
- Zeige Sichern-, Verschieben- und Spam-Schaltfläche.
+ Zeige Archivieren-, Verschieben- und Spam-Schaltfläche.Scrolle Spam-LeisteBilder automatisch anzeigen
@@ -561,12 +559,22 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Nachricht verfassen
+ Nachricht beim Antworten zitieren
+ Beim Antworten die Original-Nachricht als Zitat einfügen.
+
Antwort unter Zitat
- Die Antwort auf eine Nachricht unterhalb der Originalnachricht platzieren.
+ Die Antwort auf eine Nachricht unterhalb der Original-Nachricht platzieren.
+
+ Unterschrift von zitierter Antwort entfernen
+ Beim Antworten von Nachrichten wird die Unterschrift vom zitiertem Textabschnitt entferntFormatierungEinfacher Text (Bilder und Formatierungen werden entfernt)HTML (Bilder und Formatierungen bleiben erhalten)
+ Automatisch (Einfacher Text, es sei denn bei Antwort auf HTML)
+
+ Empfangsbestätigung
+ Immer eine Empfangsbestätigung anfordernAntwortkopfNormal (wie in Gmail, Pine)
@@ -586,12 +594,14 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Auto-signEmail Adresse des Kontos verwenden um Signaturschlüssel zu schätzen.
+ Automatische verschlüsselung
+ Verschlüsselung aktivieren falls für den Empfänger ein öffentlichen Schlüssel abgespeichert ist.
+
Häufigkeit der E-Mail-AbfrageHäufigkeit der Abfrage für Nebenordner
-
+
Speicher
-
Farbe des KontosWählen Sie die Farbe, in der das Konto in der Konten- und Ordnerliste dargestellt wird
@@ -613,6 +623,8 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
512Kb1Mb2Mb
+ 5Mb
+ 10Mbjede Größe (kein Limit)Nachrichten synchronisieren
@@ -629,7 +641,6 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
der letzten 6 Monatedes letzten Jahres
-
Ordner anzeigenAlleNur Hauptordner
@@ -704,7 +715,6 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
LED BlinkenLED blinkt bei neuer Nachricht
-
ServereinstellungenOptionen für das Verfassen von Nachrichten
@@ -752,7 +762,6 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Konto/Identität auswählenSende als
-
Gehen Sie zu \"Kontoeinstellungen\" -> \"Identitäten verwalten\" um Identitäten zu erstellenSie können Ihre einzige Identität nicht löschenSie können keine Identität ohne E-Mail-Adresse verwenden
@@ -794,8 +803,11 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
der richtigen E-Mail-Adresse und dem richtigen Kennwort anmelden können, haben Sie möglicherweise die Gebühren für das
\"Plus\"-Konto nicht bezahlt. Starten Sie den Webbrowser, um auf
diese Mailkonten zuzugreifen.
-
- Wenn Sie für diesen Provider POP3 verwenden möchten, sollten Sie in den "Yahoo! Mail"-Enstellungen POP3 aktivieren.
+ Wenn Sie für diesen Provider POP3 verwenden möchten, sollten Sie in den "Yahoo! Mail"-Einstellungen POP3 aktivieren.
+ Wenn Sie für diesen Provider IMAP oder POP3 verwenden möchten, sollten Sie dies auf der "Naver Mail"-Einstellungsseite aktivieren.
+ Wenn Sie für diesen Provider IMAP oder POP3 verwenden möchten, sollten Sie dies auf der "Hanmail(Daum)"-Einstellungsseite aktivieren.
+ Wenn Sie für diesen Provider IMAP oder POP3 verwenden möchten, sollten Sie dies auf der "Paran"-Einstellungsseite aktivieren.
+ Wenn Sie für diesen Provider IMAP oder POP3 verwenden möchten, sollten Sie dies auf der "Nate Mail"-Einstellungsseite aktivieren.Ungültiges ZertifikatZertifikat akzeptieren
@@ -817,14 +829,14 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Q - Zurück zu den Konten\u000A
S - Kontoeinstellungen bearbeiten
+ Ordnername enthält
+
OrdnerAlle Ordner anzeigenNur Hauptordner anzeigenHaupt- und Nebenordner anzeigenAlle außer Nebenordner anzeigen
-
-
Position der SignaturVor zitierter NachrichtNach zitierter Nachricht
@@ -847,8 +859,6 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
System ZoomAktiviere Zoom-Widgets oder 2-Finger-Zoom, wenn vom Gerät unterstützt
-
-
SystemvorgabeHintergrund-Synchronisierung
@@ -875,7 +885,7 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Gewählte als ungelesen markierenGewählte als wichtig markierenMarkierung bei Gewählten entfernen
- Gewählte sichern
+ Gewählte archivierenGewählte als Spam markierenGewählte verschiebenGewählte kopieren
@@ -910,8 +920,8 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
\"Zurück\"-TasteDie \"Zurück\"-Taste bringt Sie eine Ebene nach oben
- Integrierter Posteingang bei Start
- Zeige beim Startup den integrierten Posteingang
+ Gemeinsamer Posteingang bei Start
+ Zeige gemeinsamen Posteingang beim ProgrammstartKonto-Größe anzeigenDeaktivieren für schnellere Anzeige
@@ -919,8 +929,8 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Suchergebnisse zählenDeaktivieren für schnellere Anzeige
-
-
+ Spezial-Konten verbergen
+ "Gemeinsamer Posteingang" und "Alle Nachrichten" verbergen%s%s - Wichtig
@@ -1012,8 +1022,14 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Entwurf speichern?Entwurf speichern oder verwerfen?
+
+ Speichern des Entwurfs verweigern.
+ Die Speicherung von als verschlüsselt markierten Entwürfen verweigern.
+
+ Ohne öffentlichen Schlüssel fortfahren?
+ Einer oder mehrere Empfänger besitzen keinen abgespeicherten öffentlichen Schlüssel. Fortfahren?
- Die Nachricht konnte nicht dargestellt werden da das Charset \"%s\" nicht gefunden wurde.
+ Die Nachricht konnte nicht dargestellt werden, da das Charset \"%s\" nicht gefunden wurde.Selektieren Sie Text um ihn zu kopieren.
@@ -1023,7 +1039,10 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
Nicht löschenAls Spam markieren
- Wollen Sie diese Nachricht in den Spam-Ordner verschieben?
+
+ Wollen Sie diese Nachricht in den Spam-Ordner verschieben?
+ Wollen Sie diese Nachrichten in den Spam-Ordner verschieben?
+ JaNein
@@ -1034,10 +1053,56 @@ Willkommen zum \"K-9 Mail\"-Setup. K-9 ist eine quelloffene E-Mail-Anwendung fü
»›Verbindungsfehler.
+
+ Einstellungen Importieren & Exportieren
+ Kontoeinstellungen exportieren
+ Einstellungen und Konten exportieren
+ Importieren
+ Export
+ Einstellungen importieren
+ Auswahl importieren
+ Globale Einstellungen
+ Einstellungen Exportieren...
+ Einstellungen Importieren...
+ Datei lesen...
+ Exportiere Einstellungen erfolgreich in %s gespeichert
+ Globale Einstellungen erfolgreich von %s importiert
+ %s erfolgreich von %s importiert
+
+ 1 Konto
+ %s Konten
+
+ Exportieren der Einstellungen ist fehlgeschlagen
+ Importieren der Einstellungen von %s sind fehlgeschlagen
+ Export erfolgreich
+ Export fehlgeschlagen
+ Import erfolgreich
+ Import fehlgeschlagen
+ Konto aktivieren
+ Um das Konto \"%s\" zu benutzen müssen sie das %s angeben.
+
+ Server Passwort
+ Server Passwörter
+
+ Posteingangsserver (%s):
+ Postausgangsserver (%s):
+
+ Passwort Setzen...
+ Passwörter setzen...
+
+ Passwort des Posteingangsservers benutzen
+ Aktivieren
+
+ Kann die Datei-Version %s nicht verwendenKonto \"%s\" ist nicht verfügbar; Bitte SD-Karte prüfen.Anhang speichern unter...Anhang speichernEs wurde kein Dateimanager gefunden. Wo soll der Anhang abgelegt werden?
+
+ Nach oben verschieben
+ Nach unten verschieben
+ Konto verschieben...
+
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 267874dc2..e5e2cb121 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -6,9 +6,7 @@
Copyright 2008-%s The K-9 Dog Walkers. Partes Copyright 2006-%s the Android Open Source Project.Liceciado bajo Licencia Apache, Versión 2.0.Autores: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesInformación de la revisión %s
- http://code.google.com/p/k9mail/Estamos usando las siguientes librerías de terceros: %sIconos de Emoji: %s
@@ -85,8 +83,6 @@
Eliminar cuentaLimipar acciones pendientes (peligroso!)
-
-
Cuentas◀◀
@@ -111,6 +107,9 @@
Ver/Ocultar detallesAñadir Cc/BccEditar Asunto
+
+
+
Añadir adjuntoAñadir adjunto (Imagen)Añadir adjunto (Vídeo)
@@ -268,8 +267,7 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Algunos adjuntos no se han descargado. Serán descargados automáticamente antes de que se envíe el mensajeAlgunos adjuntos no pueden reenviarse porque no han sido descargados.
-
-
+
Desde: %s <%s>Para:
@@ -289,7 +287,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Obteniendo adjuntos.Imposible encontrar visualizador para %s.
-
Descargar mensaje completo
@@ -316,7 +313,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Sobre %sVersión: %s
-
Ver estrellasLas estrellas indican un mensaje destacadoSelección múltiple
@@ -336,6 +332,8 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Utilizar tamaño fijo de fuente cuando se muestre mensajes en texto planoVolver a la lista después de borrarVolver a la lista después de la acción de borrado
+
+
Confirmar acciónMostrar un diálogo cuando se realice una de estas acciones
@@ -348,13 +346,11 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Bloquear notificacionesNo mostrar asunto del mensaje en la barra de notificaciones cuando el sistema está bloqueado.
-
Tiempo de SilencioDesactivar sonidos, alertas y luces por la nocheSilencio comienzaSilencio termina
-
Configurar nueva cuentaIntroduzca dirección de correo(Debe Añadir %d más cuentas.)
@@ -426,8 +422,8 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Durante comprobaciónSólo manualmente
+
Prefijo de la Dirección IMAP
- (Usar automáticamente NAMESPACE)Carpeta BorradoresCarpeta Enviados
@@ -518,7 +514,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
1000 mensajesTodos los mensajes
-
No se puede copiar/mover un mensaje que no ha sido sincronizado con el servidorNo se ha podido finalizar la Configuración
@@ -562,6 +557,9 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Configuración Saliente
+
+
+
Respuesta tras citaCuando se responda a un correo, el texto original estará por encima de su respuesta
@@ -569,6 +567,9 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Texto plano (se quitan las imágenes y el formato)HTML (se mantienen las imágenes y el formato)
+
+
+
Estilo de cita al responderPrefijo (como Gmail, Pine)Cabecera (como Outlook, Yahoo!, Hotmail)
@@ -592,7 +593,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Almacenamiento
-
Color de la cuentaSeleccione el color a utilizar en la carpeta y en la cuenta
@@ -614,6 +614,8 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
512Kb1Mb2Mb
+ 5Mb
+ 10Mbcualquier tamaño (sin límite)Sincronizar desde
@@ -630,7 +632,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
los últimos 6 mesesel último año
-
Carpetas a mostrarTodasSólo 1a clase
@@ -705,7 +706,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Parpadeo LEDParpadear el LED cuando llega nuevo correo
-
Configurar ServidorOpciones de edición de mensaje
@@ -753,7 +753,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Seleccionar cuenta/identidadEnviar como
-
Ir a Configuración cuentas -> y a identidad para crear una nueva identidadNo puedes eliminar tu única identidadNo puedes utilizar una identidad sin dirección de correo
@@ -793,8 +792,11 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Sólo algunas cuentas \"Plus\" pueden utilizar acceso POP
Si no puede acceder con su contraseña y usuario y no tiene una cuenta de pago.
Es posible que pueda acceder sólo via web.
-
Si quiere utilizar el correo POP3 para este proveedor debe activar este acceso en la Configuración de yahoo.
+
+
+
+
Certificado desconocidoAceptar certificado
@@ -823,8 +825,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Ver carpetas de 1a y 2a ClaseVer todas excepto las de 2a Clase
-
-
Posición de la FrimaAntes del texto citadoDespués del texto citado
@@ -847,8 +847,6 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
Controles del Zoom por sistemaPermitir opciones de zoom que soporta el propio dispositivo
-
-
Configurado en el sistemaSincronizar en segundo plano
@@ -1023,7 +1021,20 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
No borrar
-
+
@@ -1035,9 +1046,55 @@ Bienvenido a la Configuración de K-9. K-9 es un cliente de correo OpenSource pa
›Imposible conectar.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 1417f417b..534df7cd7 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -6,9 +6,7 @@
Tekijänoikeudet 2008-%s The K-9 Dog Walkers. Portions tekijänoikeudet -%s Androidin avoimen lähdekoodin hanke.Lisensoitu Apache-lisenssillä, versio 2.0.Tekijät: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesVersiotiedot: %s
- http://code.google.com/p/k9mail/Me käytämme seuraavia kolmannen osapuolen kirjastoja: %sEmoji-kuvakkeet: %s
@@ -85,8 +83,6 @@
Poista tiliTyhjennä odottavat toimenpiteet (vaara!)
-
-
Tilit◀◀
@@ -112,6 +108,9 @@
Näytä/piilota lisätiedotLisää Kopio/PiilokopioMuokkaa aihetta
+
+
+
Lisää liiteLisää liite (kuva)Lisää liite (video)
@@ -266,8 +265,7 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Kaikkia liitteitä ei ladattu. Ne ladataan automaattisest ennen tämän viestin lähettämistä.Joitakin liitteitä ei voida jatkolähettää, koska niitä ei ole ladattu.
-
-
+
Lähettäjä: %s <%s>Vast.ottaja:
@@ -287,7 +285,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Haetaan liitettä.Ei löydy katseluohjelmaa tyypille %s.
-
Lataa koko viesti
@@ -314,7 +311,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Tietoja %sVersio: %s
-
Viestin tähdetTähdet ilmaisevat merkityt viestitUsean valinnan valintaruudut
@@ -334,6 +330,8 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Käytä kiinteää kirjasinleveyttä muotoilemattomille viesteillePalaa poiston jälkeen listanäkymäänPalaa viestilistaan viestin poiston jälkeen
+
+
Vahvista toimenpiteetNäytä keskusteluikkuna valitun toimenpiteen suorituksesta
@@ -346,13 +344,11 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Lukitusnäytön ilmoituksetÄlä näytä viestin aihetta ilmoituspalkissa jos laite on lukittuna
-
Hiljainen aikaPoista käytöstä soittoäänen pirinä, pärinä ja vilkkuminen yölläHiljainen aika alkaaHiljainen aika päättyy
-
Lisää uusi tiliAnna tilin sähköpostiosoite:(Voit lisätä vielä %d tiliä.)
@@ -424,8 +420,8 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Jokaisen tarkistuksen aikanaVain manuaalisesti
+
IMAP -polun etuliite
- (Automaattinen, käytä NIMITILAA jos on käytettävissä)Luonnokset-kansioLähetetyt-kansio
@@ -514,7 +510,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
1000 viestiäKaikki viestit
-
Viestiä ei voi kopioida tai siirtää koska se ei ole synkronoitu palvelimelleAsennus ei onnistunut
@@ -558,6 +553,9 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Lähetetään postia
+
+
+
Vastaa lainauksen jälkeenKun viestiin vastataan, alkuperäinen viesti on vastauksesi yläpuolella.
@@ -565,6 +563,9 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Pelkkä teksti (kuvat ja muotoilu on poistettu)HTML (kuvat ja muotoilu säilytetään)
+
+
+
Vastaa lainaamalla tyyliEtuliite (kuten Gmail, Pine)Otsikko (kuten Outlook, Yahoo!, Hotmail)
@@ -588,7 +589,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Tallennus
-
Tilin väriValitse väri tilin kansio- ja tililistaukseen
@@ -610,6 +610,8 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
512 kt1 Mt2 Mt
+ 5 Mt
+ 10 Mtmikä tahansa (ei rajoitusta)Synkronoi viestit
@@ -626,7 +628,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
viimeiset 6 kuukauttaviime vuonna
-
Näytä kansiotKaikkiVain 1. luokan kansiot
@@ -701,7 +702,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Merkkivalo vilkkuuViestin saapuessa merkkivalo vilkkuu
-
Palvelimen asetuksetViestin kirjoituksen asetukset
@@ -749,7 +749,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Valitse tili/identiteettiLähetä
-
Mene tilin asetuksiin -> Hallitse identiteettejä luodaksesi identiteetinEt voi poistaa ainoaa identiteettiäsiIdentiteettiä ei voi käyttää ilman sähköpostiosoitetta
@@ -790,8 +789,11 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
joka sallii tämän ohjelman ottaa yhteyden. Jos et voi kirjautua
oikealla sähköpostiosoitteella ja salasanalla, sinulla ei voi olla maksullista
\"Plus\"-tiliä. Ole hyvä ja käytä www-selainta käyttääksesi niihin sähköpostitileihin.
-
Jos haluat käyttää tämän palveluntarjoajan POP3:a, sinun tulee sallia käyttää POP3 Yahoon sähköpostin asetukset-sivulla.
+
+
+
+
Tunnistamaton sertifikaattiHyväksy-avain
@@ -820,8 +822,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Näytä 1. ja 2. luokan kansiotNäytä kaikki paitsi 2. luokan kansiot
-
-
Allekirjoituksen sijaintiEnnen lainattua viestiäLainatun viestin jälkeen
@@ -844,8 +844,6 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Järjestelmän zoomin ohjausOta widgetin zoomaus tai nipistys-zoomaus, jos laite tukee
-
-
Järjestelmän oletusSynkronointi taustalla
@@ -1020,7 +1018,20 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
Älä poista
-
+
@@ -1032,9 +1043,55 @@ Tervetuloa K-9 Mail asennukseen. K-9 on avoimen lähdekoodin sähköpostiasiak
›Yhteyden muodostus epäonnistui.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index ce1d95944..16d59b1a2 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -41,4 +41,10 @@
Montrer les boutons Archiver, Déplacer ou PourrielDéplacer vers PourrielsMaximum de dossiers poussés à vérifier
+ Aucune adresse courriel trouvée
+ Afficher le nom des correspondants plutôt que leurs adresses courriel
+
+ Voulez-vous déplacer ce message vers le dossiers à pourriels\u00A0?
+ Voulez-vous déplacer %1$d messages vers le dossiers à pourriels\u00A0?
+
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 2cd499836..3b3a86fde 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -1,879 +1,1141 @@
-
- K-9 Mail
- K-9 Mail BETA
- Google, Les K-9 Dog Walkers.
- Auteurs\u00A0: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotes
- Information de révision\u00A0: %s
- http://code.google.com/p/k9mail/
+Editor:
+ArtfulBits Inc. (c) 2005-2009 (http://www.artfulbits.com)
+Android Localizer (aiLocalizer)
+-->
+
+ K-9 Mail
+ K-9 Mail BETA
+ Google, Les K-9 Dog Walkers.
+ Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project.
+ Licensed under the Apache License, Version 2.0.
+ Auteurs\u00A0: %s
+ Information de révision\u00A0: %s
+ Tierces librairies utilisées\u00A0: %s
+ Icônes Emoji\u00A0: %s
- lire les pièces jointes
- Permet à cette application de lire vos pièces jointes.
+ lire les pièces jointes
+ Permet à cette application de lire vos pièces jointes.
+ lire les emails
+ Permet à cette application de lire vos emails.
+ Supprimer les emails
+ Permet à cette application d\'effacer vos emails.
- À propos de %s
- Comptes
- Avancé
- %s
- Comptes K-9
+ À propos de %s
+ Comptes
+ Avancé
+ %s
+ Comptes K-9
- %s:%s
+ %s:%s
- Composer
- Déboguer
- Choisir un dossier
- Choisir une couleur
+ Composer
+ Déboguer
+ Choisir un dossier
+ Choisir une couleur
- %s%s%s
+ %s%s%s
- \u0020[%d]
- \u0020(Récup. %s:%s%s)
- \u0020(Récup. entêtes %s:%s%s)
- \u0020(Envoi %s%s)
- \u0020(Prép %s:%s%s)
- \u0020%s/%s
- \u0020(Prochaine récupération à %s)
- Suivant
- OK
- Annuler
- Envoyer
- Envoyer à nouveau
- Sélectionner
- Désélectionner
- Répondre
- Répondre à tous
- Supprimer
- Archiver
- Spam
- Vider le dossier
- Transférer
- Déplacer
- Continuer
- Terminé
- Supprimer
- Abandonner
- Enregistrer dans les brouillons
- Réessayer
- Actualiser
- Vérif. messages
- Envoyer les messages
- Liste des dossiers
- Rafraîchir les dossiers
- Marquer tous les messages comme lus
- Ajouter un compte
- Composer
- Rechercher
- Résultats de la recherche
- Préférences
- Ouvrir
- Paramètres du compte
- Paramètres du dossier
- Paramètres globaux
- Supprimer le compte
- Annuler les actions en attente (Danger\u00A0!)
- Comptes
- ◀
- ◀
- Lire
- Marquer comme lu
- Transférer avec une autre application
- Choisir l\'expéditeur
- Marquer tous les messages comme lus
- Marquer tous les messages dans \'%s\' comme lus\u00A0? (incluant les messages dans le dossier qui ne sont pas affichés\u00A0?)
- Ajouter une étoile
- Enlever l\'étoile
- Copier
- Montrer l\'entête complète
- Masquer l\'entête complète
- Sélection de texte
- Marquer comme non lu
- Déplacer vers
- Dossiers
- Afficher/masquer les détails
- Ajouter Cc/Cci
- Modifier l\'objet
- Ajouter une pièce jointe
- Joindre une image
- Joindre une vidéo
- Paramètres de décharge
- Vider la corbeille
- Éliminer les messages supprimés
+ \u0020[%d]
+ \u0020(Récup. %s:%s%s)
+ \u0020(Récup. entêtes %s:%s%s)
+ \u0020(Envoi %s%s)
+ \u0020(Prép %s:%s%s)
+ \u0020%s/%s
+
+ \u0020(Prochaine récupération à %s)
+ \u0020(synchronisation désactivée)
+
+
+ Suivant
+ Précédent
+ OK
+ Annuler
+ Envoyer
+ Envoyer à nouveau
+ Sélectionner
+ Désélectionner
+ Répondre
+ Répondre à tous
+ Supprimer
+ Archiver
+ Spam
+ Vider le dossier
+ Transférer
+ Déplacer
+ Continuer
+ Retour
+ Terminé
+ Supprimer
+ Abandonner
+ Enregistrer dans les brouillons
+ Réessayer
+ Actualiser
+ Vérif. messages
+ Envoyer les messages
+ Liste des dossiers
+ Rafraîchir les dossiers
+ Marquer tous les messages comme lus
+ Ajouter un compte
+ Composer
+ Rechercher
+ Résultats de la recherche
+ Préférences
+ Ouvrir
+ Paramètres du compte
+ Paramètres du dossier
+ Paramètres globaux
+ Supprimer le compte
+ Annuler les actions en attente (Danger\u00A0!)
+
+ Comptes
+ ◀
+ ◀
+ Lire
+ Marquer comme lu
+ Transférer avec une autre application
+ Choisir l\'expéditeur
+
+ Marquer tous les messages comme lus
+ Marquer tous les messages dans \'%s\' comme lus\u00A0? (incluant
+ les messages dans le dossier qui ne sont pas affichés\u00A0?)
+
+ Ajouter une étoile
+ Enlever l\'étoile
+ Copier
+ Montrer l\'entête complète
+ Masquer l\'entête complète
+ Sélection de texte
+
+ Marquer comme non lu
+ Déplacer vers
+ Dossiers
+ Afficher/masquer les détails
+ Ajouter Cc/Cci
+ Modifier l\'objet
+ Accusé de réception
+ Un accusé de réception sera demandé
+ Un accusé de réception ne sera pas demandé
+ Ajouter une pièce jointe
+ Joindre une image
+ Joindre une vidéo
+ Paramètres de décharge
+ Vider la corbeille
+ Éliminer les messages supprimésEffacer les messages locaux
- Choisir le tri
- Inverser le tri
- À propos
- Préférences
- Options du compte
- Options du dossier
- (Aucun objet)
- Aucun expéditeur
- Récupération\u2026
- (Récupération %s%s)
- Chargement des messages\u2026
- Erreur de connexion
- Message non trouvé
- Erreur
- Envoi\u2026
- Réessayer de charger plus de messages
- Charger jusqu\'à %d de plus
- Go
- Mo
- ko
- oct.
-
+ Choisir le tri
+ Inverser le tri
+ À propos
+
+ Préférences
+ Options du compte
+ Options du dossier
+
+ (Aucun objet)
+ Pas de date
+ Aucun expéditeur
+ Récupération\u2026
+ (Récupération %s%s)
+ Chargement des messages\u2026
+ Erreur de connexion
+ Message non trouvé
+ Erreur
+ Envoi\u2026
+
+ Réessayer de charger plus de messages
+
+ Charger jusqu\'à %d
+de plus
+
+ Go
+ Mo
+ ko
+ oct.
+
+
Espace sur «\u00A0%s\u00A0» passé de
%s
à
%s
-
- Compactage du compte «\u00A0%s\u00A0»
- Effacement du compte «\u00A0%s\u00A0»
- Recréation du compte «\u00A0%s\u00A0»
- Nouvel e-mail
- Nouvel e-mail de %s
- %d non lu(s) (%s)
- %d nouveaux messages (%s)
- dans les comptes %d
- Message non envoyé
+
- Vérification des messages\u00A0: %s:%s
- Vérification des messages
- Envoi du message\u00A0: %s
- Envoi du message
- :
- Boîte de réception
- Boîte d\'envoi
- Brouillons
- Corbeille
- Envoyés
- Archive
- Spams
+ Compactage du compte «\u00A0%s\u00A0»
+ Effacement du compte «\u00A0%s\u00A0»
+ Recréation du compte «\u00A0%s\u00A0»
- %s (Brouillons)
- %s (Corbeille)
- %s (Envoyés)
- %s (Archive)
- %s (Spams)
+ Nouvel e-mail
+ Nouvel e-mail de %s
+ %d non lu(s) (%s)
+ %d nouveaux messages (%s)
+ dans les comptes %d
+ Message non envoyé
- Échec d\'envoi de certains messages
- Voir le dossier %s pour les détails.
- K-9 a rencontré un problème lors de l\'envoi de certains messages.
- Cependant, dû à la nature de ce problème, K-9 ne peut être certain si les messages
+ Vérification des messages\u00A0: %s:%s
+ Vérification des messages
+ Envoi du message\u00A0: %s
+ Envoi du message
+ :
+
+ Boîte de réception
+ Boîte d\'envoi
+
+ Brouillons
+ Corbeille
+ Envoyés
+ Archive
+ Spams
+
+
+ %s (Brouillons)
+ %s (Corbeille)
+ %s (Envoyés)
+ %s (Archive)
+ %s (Spams)
+
+ Échec d\'envoi de certains messages
+ Voir le dossier %s pour les détails.
+ K-9 a rencontré un problème lors de l\'envoi de certains messages.
+ Cependant, dû à la nature de ce problème, K-9 ne peut être certain si les messages
ont été envoyés. Les destinataires ont peut-être déjà reçu une copie des messages.
\u000a\u000aLes messages qui sont touchés par ce problème sont maintenant marqués d\'une étoile dans votre boîte d\'envoi.
Si vous enlevez ces étoiles, K-9 essaiera de les envoyer de nouveau.
Maintenez votre doigt sur la boîte d\'envoi et sélectionnez «\u00A0Envoyer les messages\u00A0» pour initier l\'envoi.\u000A\u000a
Le dossier %s pourrait contenir des messages d\'erreur à propos de ces échecs.
- Alerte K-9
- Synchronisation et envoi suspendus dû au réseau inaccessible.
- Aucun message
- Bienvenue dans la configuration de K-9 Mail. K-9 Mail est un client de messagerie open source pour Android basé sur le client standard Android Mail.
-\n
-\n\nVoici ce que K-9 Mail apporte de plus\u00A0:
-\n * La technologie PUSH en passant par le protocole IMAP
-\n * De meilleures performances
-\n * Signer ses messages
-\n * S\'envoyer une copie des messages automatiquement
-\n * Choisir les dossiers à synchroniser
-\n * Choisir l\'adresse e-mail de réponse
-\n * Des raccourcis clavier
-\n * Un meilleur support de l\'IMAP
-\n * Sauver les pièces jointes sur la carte SD
-\n * Vider la corbeille
-\n * Trier les messages
-\n * ...et bien plus encore
-\n
-\n Veuillez noter que K-9 Mail ne prend pas en charge les comptes Hotmail et, comme d\'autres clients, a quelques ennuis avec les serveurs Microsoft Exchange.
-\n
-\n Si vous avez des suggestions, découvert des bugs ou simplement une idée de fonctionnalité, n\'hésitez pas à vous rendre ici\u00A0: http://k9mail.googlecode.com/ (en anglais)
-
- Version\u00A0: %s
- Activer le journal de déboguage
- Journaliser les informations de diagnostic supplémentaires
- Journaliser les informations personnelles
- Vos mots de passe pourront se retrouver dans le journal
- K-9 Mail pour Android
- Tous les messages
- Messages récents de tous les comptes
- Toutes les boîtes de réception
+ Alerte K-9
+ Synchronisation et envoi suspendus dû au réseau inaccessible.
+
+ Aucun message
+
+
+Bienvenue dans la configuration de K-9 Mail. K-9 Mail est un client de messagerie open source pour Android basé sur le client standard Android Mail.
+ \n
+ \n\nVoici ce que K-9 Mail apporte de plus\u00A0:
+ \n * La technologie PUSH en passant par le protocole IMAP
+ \n * De meilleures performances
+ \n * Signer ses messages
+ \n * S\'envoyer une copie des messages automatiquement
+ \n * Choisir les dossiers à synchroniser
+ \n * Choisir l\'adresse e-mail de réponse
+ \n * Des raccourcis clavier
+ \n * Un meilleur support de l\'IMAP
+ \n * Sauver les pièces jointes sur la carte SD
+ \n * Vider la corbeille
+ \n * Trier les messages
+ \n * ...et bien plus encore
+ \n
+ \n Veuillez noter que K-9 Mail ne prend pas en charge les comptes Hotmail et, comme d\'autres clients, a quelques ennuis avec les serveurs Microsoft Exchange.
+ \n
+ \n Si vous avez des suggestions, découvert des bugs ou simplement une idée de fonctionnalité, n\'hésitez pas à vous rendre ici\u00A0: http://k9mail.googlecode.com/ (en anglais)
+
+
+
+ Version\u00A0: %s
+ Activer le journal de déboguage
+ Journaliser les informations de diagnostic supplémentaires
+ Journaliser les informations personnelles
+ Vos mots de passe pourront se retrouver dans le journal
+
+ K-9 Mail pour Android
+
+ Tous les messages
+ Messages récents de tous les comptes
+ Toutes les boîtes de réception
+
%s:%s%s%s%s%s
- Charger plus de messages
- Pour\u00A0: %s
- Supprimer
- Marquer comme lu
- Marquer comme non lu
- Ajouter une étoile
- Enlever l\'étoile
+ Charger plus de messages
+ Pour\u00A0: %s
+ Supprimer
+ Marquer comme lu
+ Marquer comme non lu
+ Ajouter une étoile
+ Enlever l\'étoile
- Pour
- Cc
- Cci
- Objet
- Texte du message
+ Pour
+ Cc
+ Cci
+ Objet
+ Texte du message-------- Message d\'origine --------Objet\u00A0:
+ Envoyé:De\u00A0:À\u00A0:Cc\u00A0:
- \n%s a écrit\u00A0:\n\n
- Texte cité
- Vous devez ajouter au moins un destinataire.
- Certaines pièces jointes n\'ont pas été téléchargées. Elles seront téléchargées automatiquement avant l\'envoi de ce message.
- Certaines pièces jointes ne peuvent pas être transmises car elles n\'ont pas été téléchargées.
+ \n%s a écrit\u00A0:\n\n
+ Texte cité
+ Vous devez ajouter au moins un destinataire.
+ Aucune adresse e-mail trouvée
+ Certaines pièces jointes n\'ont pas été téléchargées. Elles seront téléchargées automatiquement avant l\'envoi de ce message.
+ Certaines pièces jointes ne peuvent pas être transmises car elles n\'ont pas été téléchargées.
+ Citer le message
+ De\u00A0: %s <%s>
+ Pour\u00A0:
+ Cc\u00A0:
+ Ouvrir
+ Enregistrer
+ \u25BC
+ \u25B2
+ Archiver
+ Déplacer
+ Spam
+ MMM jj aaaa hh:mm a
+ Pièce jointe enregistrée sur la carte SD en tant que %s.
+ Impossible d\'enregistrer la pièce jointe sur la carte SD.
+ Sélectionnez «\u00A0Afficher les images\u00A0» pour afficher les images intégrées.
+ Afficher les images
+ Récupération de la pièce jointe.
+ Impossible de trouver un visualisateur pour %s.
+ Télécharger le message complet
- De\u00A0: %s <%s>
- Pour\u00A0:
- Cc\u00A0:
- Ouvrir
- Enregistrer
- \u25BC
- \u25B2
- Archiver
- Déplacer
- Spam
- MMM jj aaaa hh:mm a
- Pièce jointe enregistrée sur la carte SD en tant que %s.
- Impossible d\'enregistrer la pièce jointe sur la carte SD.
- Sélectionnez «\u00A0Afficher les images\u00A0» pour afficher les images intégrées.
- Afficher les images
- Récupération de la pièce jointe.
- Impossible de trouver un visualisateur pour %s.
+
+ Les entêtes n\'ont pas toutes été téléchargées ou enregistrées. Sélectionnez «\u00A0Enregistrer toutes les entêtes localement\u00A0» dans les paramètres du serveur entrant pour activer cette fonction.
+ Toutes les entêtes ont été téléchargées, mais il n\'y en a pas d\'autres à montrer.
+ La récupération d\'entêtes supplémentaires de la base de données ou du serveur a échouée.
- Télécharger le message complet
+ Dossiers
+ Nouveau dossier
- Les entêtes n\'ont pas toutes été téléchargées ou enregistrées. Sélectionnez «\u00A0Enregistrer toutes les entêtes localement\u00A0» dans les paramètres du serveur entrant pour activer cette fonction.
- Toutes les entêtes ont été téléchargées, mais il n\'y en a pas d\'autres à montrer.
- La récupération d\'entêtes supplémentaires de la base de données ou du serveur a échouée.
- Dossiers
- Nouveau dossier
- Nouveau nom de dossier
- (Push)
- Plus de cet expéditeur
- Message copié
- Message déplacé
- Message supprimé
- Message abandonné
- Message enregistré comme brouillon
- Le message n\'a pû être supprimé
- À propos de %s
- Version\u00A0: %s
- Étoiles des messages
- Les étoiles indiquent des messages suivis
- Cases à cocher
- Toujours afficher les cases à cocher
- Interface conviviale au toucher
- Fournit plus d\'espace dans les éléments des listes
+ Nouveau nom de dossier
+
+ (Push)
+
+ Plus de cet expéditeur
+
+ Message copié
+ Message déplacé
+ Message supprimé
+ Message abandonné
+ Message enregistré comme brouillon
+ Le message n\'a pû être supprimé
+
+ À propos de %s
+ Version\u00A0: %s
+
+ Étoiles des messages
+ Les étoiles indiquent des messages suivis
+ Cases à cocher
+ Toujours afficher les cases à cocher
+ Interface conviviale au toucher
+ Fournit plus d\'espace dans les éléments des listesLignes dʼaperçu
-
- Afficher les noms des contacts connus
- Utiliser les noms du carnet d\'adresses
+ Afficher le nom des correspondants
+ Afficher le nom des correspondants plutôt que leurs adresses e-mail
+ Utiliser les noms du carnet d\'adresses
+ Utiliser en priorité les noms du carnet d\'adressesCouleur des contacts connusNe pas mettre en évidence les contacts connusMettre en évidence (couleur) les contacts connus
- Polices à taille fixe
- Utiliser une police à taille fixe pour les messages en texte brut
- Retour à la liste après suppression
- Retourne à la liste de messages après la suppression d\'un message
+ Polices à taille fixe
+ Utiliser une police à taille fixe pour les messages en texte brut
+ Retour à la liste après suppression
+ Retourner à la liste de messages après la suppression d\'un message
+ Voir le message suivant après suppression
+ Voir le message suivant par défaut après suppressionConfirmer les actionsDemander une confirmation pour chacune des actions sélectionnéesArchiverSupprimer (mode lecture)
+ Supprimer étoilé (mode lecture)Spam
+ Marquer tout comme luEnvoyerNotifications confidentiellesNe pas afficher les sujets des e-mails dans la barre de notification quand le système est verrouillé
-
Heures silencieusesDésactiver les sons, vibrations et éclairage DEL aux heures programméesDébut des heures silencieusesFin des heures silencieuses
+ Configurer la messagerie
+ Saisissez l\'adresse de messagerie de votre compte\u00A0:
+ (Vous pouvez ajouter %d comptes supplémentaires.)
+ Adresse e-mail
+ %s n\'est pas une adresse e-mail valide.
+ %s est déjà ajouté.
+ Mot de passe
+ Envoyer les messages de ce compte par défaut.
+ Configuration manuelle
- Configurer la messagerie
- Saisissez l\'adresse de messagerie de votre compte\u00A0:
- (Vous pouvez ajouter %d comptes supplémentaires.)
- Adresse e-mail
- %s n\'est pas une adresse e-mail valide.
- %s est déjà ajouté.
- Mot de passe
- Envoyer les messages de ce compte par défaut.
- Configuration manuelle
-
- Récupération des informations de compte\u2026
- Vérification des paramètres de serveur entrant\u2026
- Vérification des paramètres de serveur sortant\u2026
+
+ Récupération des informations de compte\u2026
+ Vérification des paramètres de serveur entrant\u2026
+ Vérification des paramètres de serveur sortant\u2026Authentification\u2026Récupération des paramètres du compte\u2026
- Finition\u2026
- Annulation\u2026
- Presque terminé\u00A0!
- Votre compte est configuré et les messages sont en route\u00A0!
- Donnez un nom à ce compte (optionnel)\u00A0:
- Saisissez votre nom (s\'affiche sur les messages sortants)\u00A0:
- Votre compte est configuré\u00A0!\n\nRécupération des messages\u2026
- Ajouter un nouveau compte de messagerie
- Quel type de compte est-ce\u00A0?
- Compte POP3
- Compte IMAP
- Exchange (WebDAV)
- Paramètres de serveur entrant
- Nom d\'utilisateur
- Mot de passe
- Serveur POP3
- Serveur IMAP
- Serveur Exchange (WebDAV)
- Port
- Type de sécurité
- Type d\'authentification
- Aucun
- SSL (si disponible)
- SSL (toujours)
- TLS (si disponible)
- TLS (toujours)
- Supprimer les messages du serveur\u00A0:
- Jamais
- Après 7 jours
- Lorsque je supprime de la boîte de réception
- Marquer comme lu sur le serveur
- Utiliser la compression sur le réseau\u00A0:
- Réseau mobile
- Wi-Fi
- Autre
- Téléchargement des entêtes de messages
- Enregistrer toutes les entêtes localement
+ Finition\u2026
+ Annulation\u2026
+
+ Presque terminé\u00A0!
+ Votre compte est configuré et les messages sont en route\u00A0!
+ Donnez un nom à ce compte (optionnel)\u00A0:
+ Saisissez votre nom (s\'affiche sur les messages sortants)\u00A0:
+
+ Votre compte est configuré\u00A0!\n\nRécupération des messages\u2026
+
+ Ajouter un nouveau compte de messagerie
+ Quel type de compte est-ce\u00A0?
+ Compte POP3
+ Compte IMAP
+ Exchange (WebDAV)
+
+ Paramètres de serveur entrant
+ Nom d\'utilisateur
+ Mot de passe
+ Serveur POP3
+ Serveur IMAP
+ Serveur Exchange (WebDAV)
+ Port
+ Type de sécurité
+ Type d\'authentification
+ Aucun
+ SSL (si disponible)
+ SSL (toujours)
+ TLS (si disponible)
+ TLS (toujours)
+
+ Supprimer les messages du serveur\u00A0:
+ Jamais
+ Après 7 jours
+ Lorsque je supprime de la boîte de réception
+ Marquer comme lu sur le serveur
+
+ Utiliser la compression sur le réseau\u00A0:
+ Réseau mobile
+ Wifi
+ Autre
+
+ Téléchargement des entêtes de messages
+ Enregistrer toutes les entêtes localementStockage externe (carte SD)Stockage interneStockage additionnel %1$sEmplacement du stockage
- Élimination des messages
- Immédiatement après avoir supprimé ou déplacé
- Pendant chaque récupération
- Seulement manuellement
- Préfixe de chemin IMAP
- Optionnel
- Nom du dossier des brouillons
- Nom du dossier des envoyés
- Nom du dossier de la corbeille
- Nom du dossier des archives
- Nom du dossier des spams
- Afficher seulement les dossiers auxquels je suis abonné
- Ouvrir automatiquement le dossier
- Chemin WebDAV (Exchange)
- Optionnel
- Chemin d\'authentification
- Optionnel
- Chemin de la boîte de réception
- Optionnel
- Paramètres du serveur sortant
- Serveur SMTP
- Port
- Type de sécurité
- Aucune
- SSL
- TLS (si disponible)
- TLS (toujours)
- Authentification requise
- Nom d\'utilisateur
- Mot de passe
- Type d\'authentification
- Nom d\'utilisateur et mot de passe
- Nom d\'utilisateur
- Mot de passe
- POP avant SMTP
- IMAP avant SMTP
- WebDAV (Exchange) avant SMTP
- Paramétrage incorrect\u00A0: %s
- Options du compte
- Compacter
- Vider les messages (Danger\u00A0!)
- Recréer les données (Dernier recours\u00A0!)
- Fréquence de vérification de la messagerie
- Jamais
- Toutes les minutes
- Toutes les 5 minutes
- Toutes les 10 minutes
- Toutes les 15 minutes
- Toutes les 30 minutes
- Toutes les heures
- Toutes les 2 heures
- Toutes les 3 heures
- Toutes les 6 heures
- Toutes les 12 heures
- Toutes les 24 heures
- Effectuer une récupération lors d\'une connexion Push
- Activer le Push sur ce compte
- Si supporté par le serveur, les messages apparaîtront instantanément. Cette option peut considérablement améliorer ou dégrader les performances
- Rafraîchir la connexion IDLE
- Toutes les minutes
- Toutes les 2 minutes
- Toutes les 3 minutes
- Toutes les 6 minutes
- Toutes les 12 minutes
- Toutes les 24 minutes
- Toutes les 36 minutes
- Toutes les 48 minutes
- Toutes les 60 minutes
- Envoyer les messages de ce compte par défaut
- Me notifier à l\'arrivée de messages
- M\'avertir pendant la vérification des messages
- Nombre de messages à afficher
- 10 messages
- 25 messages
- 50 messages
- 100 messages
- 250 messages
- 500 messages
- 1000 messages
- Tous
+ Élimination des messages
+ Immédiatement après avoir supprimé ou déplacé
+ Pendant chaque récupération
+ Seulement manuellement
- Impossibilité de copier ou déplacer un message qui n\'est pas synchronisé aver le serveur
- La configuration n\'a pu terminer
- Nom d\'utilisateur ou mot de passe incorrect.\n(%s)
- Impossible de se connecter de manière sûre au serveur.\n(%s)
- Impossible de se connecter au serveur.\n(%s)
- Modifier les détails
- Continuer
+ Auto-detection des espaces de noms IMAP
+ Préfixe de chemin IMAP
+
+ Nom du dossier des brouillons
+ Nom du dossier des envoyés
+ Nom du dossier de la corbeille
+ Nom du dossier des archives
+ Nom du dossier des spams
+
+ Afficher seulement les dossiers auxquels je suis abonné
+ Ouvrir automatiquement le dossier
+
+ Chemin OWA
+ Optionnel
+
+ Chemin d\'authentification
+ Optionnel
+ Alias du compte
+ Optionnel
+
+ Paramètres du serveur sortant
+ Serveur SMTP
+ Port
+ Type de sécurité
+ Aucune
+ SSL
+ TLS (si disponible)
+ TLS (toujours)
+ Authentification requise
+ Nom d\'utilisateur
+ Mot de passe
+ Type d\'authentification
+
+ Nom d\'utilisateur et mot de passe
+ Nom d\'utilisateur
+ Mot de passe
+ POP avant SMTP
+ IMAP avant SMTP
+ WebDAV (Exchange) avant SMTP
+
+ Paramétrage incorrect\u00A0: %s
+
+ Options du compte
+
+ Compacter
+ Vider les messages (Danger\u00A0!)
+ Recréer les données (Dernier recours\u00A0!)
+
+ Fréquence de vérification de la messagerie
+
+ Jamais
+ Toutes les minutes
+ Toutes les 5 minutes
+ Toutes les 10 minutes
+ Toutes les 15 minutes
+ Toutes les 30 minutes
+ Toutes les heures
+ Toutes les 2 heures
+ Toutes les 3 heures
+ Toutes les 6 heures
+ Toutes les 12 heures
+ Toutes les 24 heures
+
+ Effectuer une récupération lors d\'une connexion Push
+ Activer le Push sur ce compte
+ Si supporté par le serveur, les messages apparaîtront instantanément. Cette option peut considérablement améliorer ou dégrader les performances
+ Rafraîchir la connexion IDLE
+ Toutes les minutes
+ Toutes les 2 minutes
+ Toutes les 3 minutes
+ Toutes les 6 minutes
+ Toutes les 12 minutes
+ Toutes les 24 minutes
+ Toutes les 36 minutes
+ Toutes les 48 minutes
+ Toutes les 60 minutes
+
+ Envoyer les messages de ce compte par défaut
+ Me notifier à l\'arrivée de messages
+ M\'avertir pendant la vérification des messages
+
+
+ Nombre de messages à afficher
+ 10 messages
+ 25 messages
+ 50 messages
+ 100 messages
+ 250 messages
+ 500 messages
+ 1000 messages
+ Tous
+
+ Impossibilité de copier ou déplacer un message qui n\'est pas synchronisé aver le serveur
+
+ La configuration n\'a pu terminer
+ Nom d\'utilisateur ou mot de passe incorrect.\n(%s)
+ Impossible de se connecter de manière sûre au serveur.\n(%s)
+ Impossible de se connecter au serveur.\n(%s)
+ Modifier les détails
+ ContinuerParamètres Push
- Paramètres du compte
- Compte par défaut
- Compte par défaut
- Envoyer les messages de ce compte par défaut
- Nouveaux e-mails
- Afficher une notification dans la barre d\'état à la réception d\'un e-mail
- Synchronisation
- Afficher une notification dans la barre d\'état à la vérification de nouveaux messages
- Votre adresse e-mail
- Afficher la boîte de réception combinée
- Messages dont je suis l\'expéditeur
- Afficher une notification dans la barre d\'état même lors d\'un envoi à partir d\'une identité reliée à un compte
- Ouvrir message non lu via notification
- Recherche des messages non lus après un accès à partir des notifications
- Défiler les boutons de navigation
- Jamais
- Lorsque le clavier est disponible
- Toujours
+ Paramètres du compte
+ Compte par défaut
+ Compte par défaut
+ Envoyer les messages de ce compte par défaut
+ Nouveaux e-mails
+ Afficher une notification dans la barre d\'état à la réception d\'un e-mail
+ Synchronisation
+ Afficher une notification dans la barre d\'état à la vérification de nouveaux messages
+ Votre adresse e-mail
+ Afficher la boîte de réception combinée
+ Messages dont je suis l\'expéditeur
+ Afficher une notification dans la barre d\'état même lors d\'un envoi à partir d\'une identité reliée à un compte
+ Ouvrir message non lu via notification
+ Recherche des messages non lus après un accès à partir des notifications
+ Afficher le nombre de messages non lus
+ Afficher le nombre de messages non lus dans la barre de notification
- Activer les boutons de déplacement
- Afficher les boutons Archiver, Déplacer ou Spam
- Défiler les boutons de déplacement
+ Défiler les boutons de navigation
+ Jamais
+ Lorsque le clavier est disponible
+ Toujours
- Afficher automatiquement les images
- Jamais
- Contacts uniquement
- Toujours
+ Activer les boutons de déplacement
+ Afficher les boutons Archiver, Déplacer ou Spam
+ Défiler les boutons de déplacement
- Composition de messages
+ Afficher automatiquement les images
+ Jamais
+ Contacts uniquement
+ Toujours
+
+ Composition de messages
+
+ Citer le message original
+ Inclure le message d\'origine dans la réponseRéponse après la citation
- Lors d\'une réponse, le texte d\'origine précèdera votre réponse
+ Faire précéder la réponse par le texte d\'origine
+
+ Retirer signature dans réponse citée
+ Lorsque vous répondez à des messages, la signature du texte cité sera éffacée
+
+ Format du message
+ HTML (formattage et images conservés)
+ Text brut (formattage et images omis)
+ Automatique (Text brut à moins de répondre à un message HTML)
+
+ Accusé de réception
+ Toujours demander un accusé de réception
+
+ Style de citation
+ Préfixe (Gmail, Pine)
+ En-tête (Outlook, Yahoo!, Hotmail)Paramètres générauxAffichage
- Synchronication de dossiers
- Dossiers
- Listage de messages
- Visualisation de messages
- Préfixe de citation
- Cryptographie
- Fournisseur OpenPGP
- Aucun
- Non disponible
- Signature automatique
- Utiliser l\'adresse e-mail du compte pour déduire la clé de signature
-
- Fréquence de vérification du dossier
- Fréquence de vérification pour 2ème classe
+ Synchronication de dossiers
+ Dossiers
+ Listage de messages
+ Visualisation de messages
+ Préfixe de citation
+ Cryptographie
+ Fournisseur OpenPGP
+ Aucun
+ Non disponible
+ Signature automatique
+ Utiliser l\'adresse e-mail du compte pour déduire la clé de signature
+ Cryptation automatique
+ Cryptation automatique si une clé publique correspond au destinataire.
+
+ Fréquence de vérification du dossier
+ Fréquence de vérification pour 2ème classeStockage
+ Couleur du compte
+ Choisir la couleur du compte tel qu\'affichée dans les listes de dossiers ou de comptes
- Couleur du compte
- Choisir la couleur du compte tel qu\'affichée dans les listes de dossiers ou de comptes
- Couleur de la DEL de notification
- Choisissez la couleur de clignotement de la DEL de votre téléphone
- Nombre de messages à afficher
+ Couleur de la DEL de notification
+ Choisissez la couleur de clignotement de la DEL de votre téléphone
- Télécharger automatiquement le contenu des messages jusqu\'à
- 1\u00A0ko
- 2\u00A0ko
- 4\u00A0ko
- 8\u00A0ko
- 16\u00A0ko
- 32\u00A0ko
- 64\u00A0ko
- 128\u00A0ko
- 256\u00A0ko
- 512\u00A0ko
- 1\u00A0Mo
- 2\u00A0Mo
- Aucune limite
+ Nombre de messages à afficher
- Âge maximal des messages
- Toutes dates
- Aujourd\'hui
- 2 jours
- 3 jours
- la dernière semaine
- les dernières 2 semaines
- les dernières 3 semaines
- le dernier mois
- les derniers 2 mois
- les derniers 3 mois
- les derniers 6 mois
- la dernière année
- Dossiers à afficher
- Tous
- Seulement dossiers de 1ère classe
- Dossiers de 1ère et 2ème classes
- Tous sauf les dossiers de 2ème classe
- Dossiers à vérifier en récupération
- Tous
- Seulement dossiers de 1ère classe
- Dossiers de 1ère et 2ème classes
- Tous sauf les dossiers de 2ème classe
- Aucun
- Dossiers à vérifier avec Push
- Tous
- Seulement dossiers de 1ère classe
- Dossiers de 1ère et 2ème classes
- Tous sauf les dossiers de 2ème classe
- Aucun
- Dossiers de destination déplacer/copier
- Tous
- Seulement dossiers de 1ère classe
- Dossiers de 1ère et 2ème classes
- Tous sauf les dossiers de 2ème classe
- Synchroniser les suppression à distance
- Supprimer les messages lorsqu\'effacés du serveur
- Paramètres du dossier
- Afficher dans le groupe principal
- Afficher dans le haut de la liste de dossiers
- Classe d\'affichage du dossier
- Aucune
- 1ère classe
- 2ème classe
- Classe de synchronisation du dossier
- Aucune
- 1ère classe
- 2ème classe
- Pareille à la classe d\'affichage
- Classe Push du dossier
- Aucune
- 1ère classe
- 2ème classe
- Pareille à la classe de synchronisation
- Paramètres entrants
- Configurer le serveur de messagerie entrant
- Paramètres sortants
- Configurer le serveur de messagerie sortant
- Ajouter un autre compte
- Nom du compte
- Votre nom
- Paramètres de notification
- Sonner lorsqu\'un message arrive
- Vibreur
- Vibrer à la réception d\'un e-mail
- Type de vibration
- Défauts
- Type 1
- Type 2
- Type 3
- Type 4
- Type 5
- Nombre de vibrations
- Sonnerie
+ Télécharger automatiquement le contenu des messages jusqu\'à
+ 1\u00A0ko
+ 2\u00A0ko
+ 4\u00A0ko
+ 8\u00A0ko
+ 16\u00A0ko
+ 32\u00A0ko
+ 64\u00A0ko
+ 128\u00A0ko
+ 256\u00A0ko
+ 512\u00A0ko
+ 1\u00A0Mo
+ 2\u00A0Mo
+ 5Mo
+ 10Mo
+ Aucune limite
+ Âge maximal des messages
+ Toutes dates
+ Aujourd\'hui
+ 2 jours
+ 3 jours
+ la dernière semaine
+ les dernières 2 semaines
+ les dernières 3 semaines
+ le dernier mois
+ les derniers 2 mois
+ les derniers 3 mois
+ les derniers 6 mois
+ la dernière année
+
+ Dossiers à afficher
+ Tous
+ Seulement dossiers de 1ère classe
+ Dossiers de 1ère et 2ème classes
+ Tous sauf les dossiers de 2ème classe
+
+ Dossiers à vérifier en récupération
+ Tous
+ Seulement dossiers de 1ère classe
+ Dossiers de 1ère et 2ème classes
+ Tous sauf les dossiers de 2ème classe
+ Aucun
+
+ Dossiers à vérifier avec Push
+ Tous
+ Seulement dossiers de 1ère classe
+ Dossiers de 1ère et 2ème classes
+ Tous sauf les dossiers de 2ème classe
+ Aucun
+
+ Dossiers de destination déplacer/copier
+ Tous
+ Seulement dossiers de 1ère classe
+ Dossiers de 1ère et 2ème classes
+ Tous sauf les dossiers de 2ème classe
+
+ Synchroniser les suppression à distance
+ Supprimer les messages lorsqu\'effacés du serveur
+
+ Paramètres du dossier
+
+ Afficher dans le groupe principal
+ Afficher dans le haut de la liste de dossiers
+
+ Classe d\'affichage du dossier
+ Aucune
+ 1ère classe
+ 2ème classe
+
+ Classe de synchronisation du dossier
+ Aucune
+ 1ère classe
+ 2ème classe
+ Pareille à la classe d\'affichage
+
+ Classe Push du dossier
+ Aucune
+ 1ère classe
+ 2ème classe
+ Pareille à la classe de synchronisation
+
+ Paramètres entrants
+ Configurer le serveur de messagerie entrant
+ Paramètres sortants
+ Configurer le serveur de messagerie sortant
+ Ajouter un autre compte
+ Nom du compte
+ Votre nom
+ Paramètres de notification
+ Sonner lorsqu\'un message arrive
+ Vibreur
+ Vibrer à la réception d\'un e-mail
+ Type de vibration
+ Défauts
+ Type 1
+ Type 2
+ Type 3
+ Type 4
+ Type 5
+ Nombre de vibrations
+ SonnerieClignotement DELClignotement de la DEL quand un message arrive
- Paramètres du serveur
- Options de composition
- Défauts pour la composition
- Choisir vos champs De, Cci et signature par défaut
- Gérer les identités
- Créer des adresses «\u00A0De\u00A0» et signatures alternatives
- Gérer les identités
- Gérer l\'identité
- Éditer l\'identité
- Nouvelle identité
- Envoyer une copie de tous les messages à
- Envoyer une copie de tous les messages envoyés à cette adresse
- Éditer
- Monter
- Descendre
- Monter en haut / mettre par défaut
- Enlever
- Description de l\'identité
- (Optionnel)
- Votre nom
- (Optionnel)
- Adresse e-mail
- (Requise)
- Adresse de réponse
- (Optionnel)
- Signature
- (Optionnel)
- Utiliser la signature
- Signature
- Ajouter une signature à chaque message envoyé
- -- \nEnvoyé de mon téléphone Android avec K-9 Mail. Excusez la brièveté.
- Identité initiale
- Choisir l\'identité
- Choisir l\'identité
- Choisir le compte/l\'identité
+ Paramètres du serveur
+
+ Options de composition
+ Défauts pour la composition
+ Choisir vos champs De, Cci et signature par défaut
+
+ Gérer les identités
+ Créer des adresses «\u00A0De\u00A0» et signatures alternatives
+
+ Gérer les identités
+
+ Gérer l\'identité
+
+ Éditer l\'identité
+ Nouvelle identité
+
+ Envoyer une copie de tous les messages à
+ Envoyer une copie de tous les messages envoyés à cette adresse
+
+ Éditer
+ Monter
+ Descendre
+ Monter en haut / mettre par défaut
+ Enlever
+
+ Description de l\'identité
+ (Optionnel)
+ Votre nom
+ (Optionnel)
+ Adresse e-mail
+ (Requise)
+ Adresse de réponse
+ (Optionnel)
+ Signature
+ (Optionnel)
+
+ Utiliser la signature
+ Signature
+ Ajouter une signature à chaque message envoyé
+
+ -- \nEnvoyé de mon téléphone Android avec K-9 Mail. Excusez la brièveté.
+ Identité initiale
+ Choisir l\'identité
+ Choisir l\'identité
+ Choisir le compte/l\'identitéEnvoyer en tant que
- Aller dans Paramètres du compte > Gérer les identités pour créer des identités
- Vous ne pouvez votre seule identité
- Vous ne pouvez pas utiliser une identité sans adresse e-mail
- Votre choix d\'identité et vos changements de signature ne seront pas enregistrés avec un brouillon
- Plus ancient en premier
- Plus récents en premier
- A-Z par expéditeur
- Z-A par expéditeur
- A-Z par sujet
- Z-A par sujet
- Messages avec étoiles en premier
- Messages sans étoiles en premier
- Messages non lus en premier
- Messages lus en premier
- Messages avec pièces jointes en premier
- Messages sans pièces jointes en premier
- Trier...
- Date
- Expéditeur
- Sujet
- Étoile
- Lu/Non lu
- Pièces jointes
- %s
- Supprimer
- Le compte «\u00A0%s\u00A0» sera supprimé de K-9 Mail.
- Recréer compte
- Toutes les données de «\u00A0%s\u00A0» vont être effacées de K-9 Mail, mais les paramètres du compte seront sauvegardés.
- Vider le compte
- Tous les messages de «\u00A0%s\u00A0» vont être effacés de K-9 Mail, mais les paramàtres du compte seront sauvegardés
- Seuls certains comptes «\u00A0Plus\u00A0» autorisent l\'accès POP
- permettant à ce programme de se connecter. Si vous ne pouvez pas
- vous connecter avec votre adresse électronique et votre mot de passe,
- il est possible que vous n\'ayez pas payé un compte «\u00A0Plus\u00A0». Veuillez
- lancer le navigateur Web pour accéder à ces comptes de messagerie.
- Certificat non reconnu
- Accepter le certificat
- Rejetter le certificat
+ Aller dans Paramètres du compte > Gérer les identités pour créer des identités
+ Vous ne pouvez votre seule identité
+ Vous ne pouvez pas utiliser une identité sans adresse e-mail
+ Votre choix d\'identité et vos changements de signature ne seront pas enregistrés avec un brouillon
+
+ Plus ancient en premier
+ Plus récents en premier
+ A-Z par expéditeur
+ Z-A par expéditeur
+ A-Z par sujet
+ Z-A par sujet
+ Messages avec étoiles en premier
+ Messages sans étoiles en premier
+ Messages non lus en premier
+ Messages lus en premier
+ Messages avec pièces jointes en premier
+ Messages sans pièces jointes en premier
+
+ Trier...
+ Date
+ Expéditeur
+ Sujet
+ Étoile
+ Lu/Non lu
+ Pièces jointes
+ %s
+
+ Supprimer
+ Le compte «\u00A0%s\u00A0» sera supprimé de K-9 Mail.
+
+ Recréer compte
+ Toutes les données du compte «\u00A0%s\u00A0» vont être effacées de K-9 Mail, mais les paramètres seront conservés.
+
+ Vider le compte
+ Tous les messages du compte «\u00A0%s\u00A0» vont être effacés de K-9 Mail, mais les paramètres seront conservés.
+
+ Seuls certains comptes «\u00A0Plus\u00A0» autorisent l\'accès POP
+ permettant à ce programme de se connecter. Si vous ne pouvez pas
+ vous connecter avec votre adresse électronique et votre mot de passe,
+ il est possible que vous n\'ayez pas payé un compte «\u00A0Plus\u00A0». Veuillez
+ lancer le navigateur Web pour accéder à ces comptes de messagerie.
+ Pour utiliser POP3 avec ce fournisseur, vous devez activer POP3 dans les paramètres Yahoo Mail.
+ Pour utiliser IMAP ou POP3 avec ce fournisseur, veuillez vous assurer que les options IMAP ou POP3 soient activées dans les paramètres de Naver Mail.
+ Pour utiliser IMAP ou POP3 avec ce fournisseur, veuillez vous assurer que les options IMAP ou POP3 soient activées dans les paramètres de Hanmail(Daum) mail.
+ Pour utiliser IMAP ou POP3 avec ce fournisseur, veuillez vous assurer que les options IMAP ou POP3 soient activées dans les paramètres de Paran mail.
+ Pour utiliser IMAP ou POP3 avec ce fournisseur, veuillez vous assurer que les options IMAP ou POP3 soient activées dans les paramètres de Nate mail.
+
+ Certificat non reconnu
+ Accepter le certificat
+ Rejetter le certificat
+
Suppr (ou D) - Effacer\u000AR -
Répondre\u000AA - Répondre à tous\u000AF - Transférer\u000AJ ou P - Message
précédent\u000AK, N - Prochain message\u000AM - Déplacer\u000AY - Copier\u000AZ - Zoom arrière\u000AShift-Z -
Zoom avant\u000aG - Étoile
- Suppr (ou D) - Supprimer\u000AR -
+ Suppr (ou D) - Supprimer\u000AR -
Répondre\u000AA - Répondre à tous\u000AC - Composer\u000AF - Transférer\u000aM -
Déplacer\u000AY - Copier\u000AG - Étoile\u000AO - Trier\u000AI - Ordre de tri\u000AQ
- Retourner aux dossiers\u000AS - Sélectionner/Désélectionner
-
- 1 - Afficher seulement les dossiers de 1ère classe \u000A
- 2 - Afficher les dossiers de 1ère et 2ème classes\u000A
- 3 - Afficher tous les dossiers sauf 2ème classe\u000A
- 4 - Afficher tous les dossiers\u000A
- Q - Retourner au comptes\u000A
- S - Éditer les paramètres du compte
- Dossiers
- Afficher tous les dossiers
- Afficher seulement les dossiers de 1ère classe
- Afficher les dossiers de 1ère et 2ème classes
- Afficher tous sauf les dossiers de 2ème classe
- Emplacement de la signature
- Avant la citation
- Après la citation
- Foncé
- Clair
- Préférences globales
- Déboguage
+
+
+ 1 - Afficher seulement les dossiers de 1ère classe \u000A
+ 2 - Afficher les dossiers de 1ère et 2ème classes\u000A
+ 3 - Afficher tous les dossiers sauf 2ème classe\u000A
+ 4 - Afficher tous les dossiers\u000A
+ Q - Retourner au comptes\u000A
+ S - Éditer les paramètres du compte
+
+ Dossiers
+ Afficher tous les dossiers
+ Afficher seulement les dossiers de 1ère classe
+ Afficher les dossiers de 1ère et 2ème classes
+ Afficher tous sauf les dossiers de 2ème classe
+
+ Emplacement de la signature
+ Avant la citation
+ Après la citation
+ Foncé
+ Clair
+ Affichage
+ Préférences globales
+ DéboguageConfidentialitéRéseau
- Liste de comptes
- Liste de messages
- Messages
- Thème
- Langue
+ Interaction
+ Liste de comptes
+ Liste de messages
+ Messages
+ Thème
+ LangueDisposition colonne uniqueRéarranger les messages HTML pour les petits écransZoom systèmeActiver les widgets zoom ou le pincer-zoomer si supporté par le système
+ Langue du système
+ Synchronisation en arrière-plan
+ Jamais
+ Toujours
+ Lorsque «\u00A0Données en arrière-plan\u00A0» est activé
+ Lorsque «\u00A0Données en arrière-plan\u00A0» et «\u00A0Synchronisation auto\u00A0» sont activés
- Langue du système
- Synchronisation en arrière-plan
- Jamais
- Toujours
- Lorsque «\u00A0Données en arrière-plan\u00A0» est activé
- Lorsque «\u00A0Données en arrière-plan\u00A0» et «\u00A0Synchronisation auto\u00A0» sont activés
- Aucun message sélectionné
- Format de date
- SHORT
- MEDIUM
- dd-MMM-yyyy
- yyyy-MM-dd
- Opérations groupées
- Supprimer la sélection
- Marquer la sélection comme lue
- Marquer la sélection comme non lue
- Ajouter une étoile à la sélection
- Effacer l\'étoile de la sélection
- Déplacer vers Archives
- Déplacer vers Spams
- Déplacer la sélection
- Copier la sélection
- Mode étoile
- Mode sélection
- Mode normal
- Sélectionner tout
- Désélectionner tout
- Maximum de dossiers Push à vérifier
- 10 dossiers
- 25 dossiers
- 50 dossiers
- 100 dossiers
- 250 dossiers
- 500 dossiers
- 1000 dossiers
- Animation
- Utiliser des effets visuels criards
- Interface gestuelle
- Accepter le contrôle par gestuelle
+ Aucun message sélectionné
+
+ Format de date
+
+ SHORT
+ MEDIUM
+ dd-MMM-yyyy
+ yyyy-MM-dd
+
+ Opérations groupées
+ Supprimer la sélection
+ Marquer la sélection comme lue
+ Marquer la sélection comme non lue
+ Ajouter une étoile à la sélection
+ Effacer l\'étoile de la sélection
+ Déplacer vers Archives
+ Déplacer vers Spams
+ Déplacer la sélection
+ Copier la sélection
+ Mode étoile
+ Mode sélection
+ Mode normal
+ Sélectionner tout
+ Désélectionner tout
+
+ Maximum de dossiers Push à vérifier
+ 10 dossiers
+ 25 dossiers
+ 50 dossiers
+ 100 dossiers
+ 250 dossiers
+ 500 dossiers
+ 1000 dossiers
+
+ Animation
+ Utiliser des effets visuels criards
+ Interface gestuelle
+ Accepter le contrôle par gestuelle
+
+ Agencement compact
+ Modifier l\'agencement pour afficher plus d\'éléments par pageNavigation à l\'aide du volumePasser d\'un élément à l\'autre grâce aux touches de volumeVisualisation d\'un messageDifférents écrans à liste
- Gérer la touche «\u00A0Retour\u00A0»
- La touche «\u00A0Retour\u00A0» remonte toujours un niveau
- Boîte de messagerie unifiée au démarrage
- Afficher la boîte de messagerie unifiée au démarrage
- Afficher la taille du compte
- Désactiver pour un affichage plus rapide
- Compter les résultats de recherche
- Désactiver pour un affichage plus rapide
- %s%s
- - Avec étoile
- - Non lu
- Tous les messages
- Tous les messages dans les dossiers recherchables
- Boîte de messagerie unifiée
- Tous les messages des dossiers à unifier
- Tapoter l\'enveloppe ou l\'étoile pour les messages non lus ou avec étoile
- Unifier
- Les messages non lus sont affichés dans la boîte de messagerie unifiée
- Dossiers dans lesquels chercher
- Tous
- Affichables
- Aucuns
- Contrôle à distance de K-9 Mail
- Permettre à cette application de contrôler les paramètres et activités de K-9 Mail
- Taille de police
- Configurer la taille de police
- Liste de comptes
- Nom du compte
- Description du compte
- Liste des dossiers
- Nom du dossier
- Status du dossier
- Liste de messages
- Sujet du message
- Expéditeur du message
- Date du message
- Vue du message
- Expéditeur du message
- Destinataire du message (Pour)
- Destinataire du message (CC)
- Entêtes supplémentaires
- Sujet du message
- Heure du message
- Date du message
- Contenu du message
- Plus minuscule
- Minuscule
- Plus petit
- Petit
- Moyen
- Grand
- Plus grand
- Plus petit
- Petit
- Normal
- Grand
- Plus grand
- Cochez «\u00A0Paramètres > Utiliser le contounement du bogue de Gallerie\u00A0» pour être capable d\'attacher des images ou vidéos en utilisant Gallerie 3D.
- Utiliser «\u00A0Joindre une image\u00A0» ou «\u00A0Joindre une vidéo\u00A0» pour joindres des images ou vidéos avec Gallerie 3D
- Divers
- Utiliser le contounement du bogue de Gallerie
- Afficher les boutons pour ajouter des images ou vidéos en pièces jointes (pour contourner le bogue de Gallerie 3D)
+ Gérer la touche «\u00A0Retour\u00A0»
+ La touche «\u00A0Retour\u00A0» remonte toujours un niveau
-
- Aucune application n\'a été trouvée pour cette action.
- La version installée de APG n\'est pas supportée.
- Signer
- Chiffrer
- Déchiffrer
- Vérifier
- «\u00A0inconnu\u00A0»
- id\u00A0: %s
- K-9 n\'a pas la permission d\'accéder à AGP, veuillez réinstaller K-9 pour corriger cela.
- Les messages PGP/MIME ne sont pas encore supportés
- Attention\u00A0: La signature et le chiffrement des pièces jointes ne sont pas encore supportés.
- Envoi annulé.
+ Boîte de messagerie unifiée au démarrage
+ Afficher la boîte de messagerie unifiée au démarrage
- Enregistrer le brouillon\u00A0?
- Enregistrer ou abandonner ce message\u00A0?
+ Afficher la taille du compte
+ Désactiver pour un affichage plus rapide
- Ce message ne peut être affiché parce que le jeu de caractères «\u00A0%s\u00A0» n\'a pu être trouvé.
- Sélectionnez le texte à copier
+ Compter les résultats de recherche
+ Désactiver pour un affichage plus rapide
+
+ Cacher les comptes spéciaux
+ Cacher «\u00A0Boîte de messagerie unifiée\u00A0» et «\u00A0Tous les messages\u00A0»
+
+ %s%s
+ - Avec étoile
+ - Non lu
+
+ Tous les messages
+ Tous les messages dans les dossiers recherchables
+
+ Boîte de messagerie unifiée
+ Tous les messages des dossiers à unifier
+
+ Tapoter l\'enveloppe ou l\'étoile pour les messages non lus ou avec étoile
+
+ Unifier
+ Les messages non lus sont affichés dans la boîte de messagerie unifiée
+
+ Dossiers dans lesquels chercher
+ Tous
+ Affichables
+ Aucuns
+
+ Contrôle à distance de K-9 Mail
+ Permettre à cette application de contrôler les paramètres et activités de K-9 Mail
+
+ Taille de police
+ Configurer la taille de police
+
+ Liste de comptes
+ Nom du compte
+ Description du compte
+
+ Liste des dossiers
+ Nom du dossier
+ Status du dossier
+
+ Liste de messages
+ Sujet du message
+ Expéditeur du message
+ Date du message
+ Aperçu
+
+ Vue du message
+ Expéditeur du message
+ Destinataire du message (Pour)
+ Destinataire du message (CC)
+ Entêtes supplémentaires
+ Sujet du message
+ Heure du message
+ Date du message
+ Contenu du message
+
+ Plus minuscule
+ Minuscule
+ Plus petit
+ Petit
+ Moyen
+ Grand
+ Plus grand
+
+ Plus petit
+ Petit
+ Normal
+ Grand
+ Plus grand
+
+
+ Cochez «\u00A0Paramètres > Utiliser le contounement du bogue de Gallerie\u00A0» pour être capable d\'attacher des images ou vidéos en utilisant Gallerie 3D.
+
+
+ Utiliser «\u00A0Joindre une image\u00A0» ou «\u00A0Joindre une vidéo\u00A0» pour joindres des images ou vidéos avec Gallerie 3D
+
+ Divers
+ Utiliser le contounement du bogue de Gallerie
+ Afficher les boutons pour ajouter des images ou vidéos en pièces jointes (pour contourner le bogue de Gallerie 3D)
+
+
+ Aucune application n\'a été trouvée pour cette action.
+ La version installée de APG n\'est pas supportée.
+ Signer
+ Chiffrer
+ Déchiffrer
+ Vérifier
+ «\u00A0inconnu\u00A0»
+ id\u00A0: %s
+ K-9 Mail n\'a pas la permission d\'accéder à AGP, veuillez réinstaller K-9 Mail pour corriger cela.
+ Les messages PGP/MIME ne sont pas encore supportés
+ Attention\u00A0: La signature et le chiffrement des pièces jointes ne sont pas encore supportés.
+ Envoi annulé.
+
+ Enregistrer le brouillon\u00A0?
+ Enregistrer ou abandonner ce message\u00A0?
+
+ Refuser d\'enregistrer des brouillons.
+ Refuser d\'enregistrer un message marqué comme crypté.
+
+ Continuer sans clé publique?
+ Un ou plusieurs destinataires n\'ont pas de clé publique enregistrée. Continuer?
+
+ Ce message ne peut être affiché parce que le jeu de caractères «\u00A0%s\u00A0» n\'a pu être trouvé.
+
+ Sélectionnez le texte à copierConfirmer la suppressionVoulez-vous supprimer ce message\u00A0?SupprimerNe pas supprimer
+ Confirmer le déplacement
+
+ Voulez-vous déplacer ce message vers le dossiers à spams\u00A0?
+ Voulez-vous déplacer %1$d messages vers le dossiers à spams\u00A0?
+
+
+ Déplacer
+ Ne pas déplacer
+
+ Téléchargement de la pièce jointe
+
Sortie de deboguage «\u00A0logcat\u00A0» activée
+ »
+ ›
+ Connexion impossible
+
+ Paramètres d\'import & d\'export
+ Exporter les comptes
+ Exporter paramètres et comptes
+ Importation
+ Exportation
+ Importer les paramètres
+ Importer la sélection
+ Paramètres globaux
+ Exportation des paramètres...
+ Importation des paramètres...
+ Balayage des fichiers...
+ Paramètres exportés vers %s
+ Paramètres globaux importés depuis %s
+ Importés %s depuis %s
+
+ 1 compte
+ %s comptes
+
+ Impossible d\'exporter les paramètres
+ Impossible d\'importer les paramètres de %s
+ Exporation réussi
+ Exporation échoué
+ Importation réussi
+ Importation échoué
+ Activer le compte
+ Pour pouvoir utiliser le compte \"%s\" vous devez fournir le %s.
+
+ mot de passe serveur
+ mots de passe serveur
+
+ Serveur entrant (%s):
+ Serveur sortant (%s):
+
+ Réglage du mot de passe...
+ Réglages des mots de passe...
+
+ Utilisez le mot de passe du serveur entrant
+ Activer
+
+ Impossible de gérer le fichier de la version %s
+
+ Le compte «\u00A0%s\u00A0» n\'est pas disponible\u00A0; veuillez vérifier le stockage
+
+ Enregistrer les pièces jointes dans…
+ Enregistrer les pièces jointes
+ Aucun gestionnaire de fichiers trouvé. Où souhaitez-vous enregistrer cette pièce jointe\u00A0?
+
+ Déplacer haut
+ Déplacer bas
+ Déplacer compte...
+
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 111a5ab19..ff9a06f31 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -6,9 +6,7 @@
Copyright 2008-%s The K-9 Dog Walkers. Porcións Copyright 2006-%s the Android Open Source Project.Licienciado baixo a Licencia Apache, Version 2.0.Autores: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesInformación da revisión: %s
- http://code.google.com/p/k9mail/Usamos as seguintes librerías de terceiros: %sIconos Emoji: %s
@@ -85,8 +83,6 @@
Eliminar contaLimpar accións pendentes (perigroso!)
-
-
Contas◀◀
@@ -111,6 +107,9 @@
Ver/Ocultar detallesEngadir Cc/BccEditar Asunto
+
+
+
Engadir adxuntoEngadir adxunto (Imaxe)Engadir adxunto (Vídeo)
@@ -268,8 +267,7 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Non atopo enderezo electrónico.Algúns adxuntos non se descargaron. Serán descargados automáticamente antes de que mandar a mensaxeAlgúns adxuntos non poden reenviarse porque non foron descargados.
-
-
+
Dende: %s <%s>Para:
@@ -289,7 +287,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Obtendo adxuntos.Imposible atopar visor para %s.
-
Descargar mensaxe completa
@@ -316,7 +313,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Sobre %sVersión: %s
-
Ver estrelasAs estrelas indican unha mensaxe destacadaSelección múltiple
@@ -336,6 +332,8 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Usar tamaño fixo de fonte nas mensaxes en texto planoVoltar á lista despois de borrarVoltar á lista despois da acción de borrado
+
+
Confirmar acciónAmosar un diálogo cuando se realice una de estas acciones
@@ -348,13 +346,11 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Bloquear notificaciónsNon amosar asunto da mensaxe na barra de notificacións cando o sistema está bloqueado.
-
Tempo de SilencioDesactivar sons, alertas e luces pola noiteSilencio empezaSilencio remata
-
Configurar nova contaIntroduzca enderezo de correo(Debe Engadir %d máis contas.)
@@ -426,8 +422,8 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Durante comprobaciónSólo manualmente
+
Prefixo do enderezo IMAP
- (Usar automáticamente NAMESPACE)Carpeta BorradoresCarpeta Enviados
@@ -518,7 +514,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
1000 mensaxesTodas as mensaxes
-
Non se pode copiar/mover unha mensaxe que non foi sincronizada co servidorNo se puido rematar a Configuración
@@ -562,6 +557,9 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Configuración Saínte
+
+
+
Resposta tras citaCando se responda a un correo, o texto orixinal estará por riba da sua resposta
@@ -569,6 +567,9 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Texto plano (borraránse imaxes e formato)HTML (mantéñense imaxes e formato)
+
+
+
Responder estilo comentarioPrefixo (coma Gmail, Pine)Cabeceira (coma Outlook, Yahoo!, Hotmail)
@@ -592,7 +593,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Almacenamento
-
Cor da contaElixe a cor a usar na carpeta e na conta
@@ -614,6 +614,8 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
512Kb1Mb2Mb
+ 5Mb
+ 10Mbcalquera tamaño (sen límite)Sincronizar dende
@@ -630,7 +632,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
os últimos 6 meseso último ano
-
Carpetas a amosarTodasSó 1a clase
@@ -705,7 +706,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Pestanexo LEDPestanexar o LED cando chega novo correo
-
Configurar ServidorOpcións de edición de mensaxe
@@ -753,7 +753,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Seleccionar conta/identidadeEnviar como
-
Ir a Configuración contas -> e a identidade para crear unha nova identidadeNon podes eliminar a túa única identidadeNon podes usar unha identidade sen enderezo de correo
@@ -793,8 +792,11 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Só algunhas contas \"Plus\" poden usar acceso POP
Se non podes acceder coa tua contrasinal e usuario e non tes unha conta de pago.
É posible que podas acceder só vía web.
-
Se queres usar o correo POP3 para este proveedor debes activar este acceso na Configuración de Yahoo.
+
+
+
+
Certificado descoñecidoAceptar certificado
@@ -823,8 +825,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Ver carpetas de 1a e 2a ClaseVer todas agás as de 2a Clase
-
-
Posición da sinaturaAntes do texto citadoDespois do texto citado
@@ -847,8 +847,6 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Controles do Zoom por sistemaPermitir opcións de zoom que soporta o propio dispositivo
-
-
Configurado no sistemaSincronizar en segundo plano
@@ -1023,7 +1021,21 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
Non borrarConfirmar antes de mover á carpeta spam
- Queres mover esta mensaxe á carpeta spam?
+
+ Queres mover esta mensaxe á carpeta spam?
+ Queres mover esta mensaxe á carpeta spam?
+
+ SiNon
@@ -1035,9 +1047,55 @@ Benvido á Configuración de K-9. K-9 é un cliente de correo OpenSource para An
›Imposible conectar.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
A conta \"%s\" non está dispoñible; verifica o almacenamento
+
+
+
+
+
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
new file mode 100644
index 000000000..473aecfe5
--- /dev/null
+++ b/res/values-hu/strings.xml
@@ -0,0 +1,857 @@
+
+
+ K-9 Mail
+ K-9 Mail BETA
+ Google, The K-9 Dog Walkers.
+ Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project.
+ Licensed under the Apache License, Version 2.0.
+ Authors: %s
+ http://code.google.com/p/k9mail/wiki/ReleaseNotes
+ Revision Information: %s
+ http://code.google.com/p/k9mail/
+ "We're using the following third-party libraries: %s"
+ Emoji icons: %s
+ Levélmellékletek megnyitása
+ Az alkalmazás engedélyezi a levélmellékletek megnyitását.
+ Levelek olvasása
+ Az alkalmazás engedélyezi az emailek olvasását.
+ Levelek törlése
+ Az alkalmazás engedélyezi az emailek törlését.
+ About %s
+ Fióklista
+ Haladó beállítások
+ %s
+ K-9 fiókok
+ %s:%s
+ Levélírás
+ Hibakeresés
+ Válasszon mappát
+ Válasszon színt
+ %s%s%s
+ " [%d]"
+ " (%s:%s%s)"
+ " (Letöltés %s:%s%s)"
+ " (Küldés %s%s)"
+ " (Feldolgozás %s:%s%s)"
+ " %s/%s"
+ " (Frissítés @ %s)"
+ " (Nincs frissítve)"
+ Tovább
+ Vissza
+ OK
+ Mégse
+ Küldés
+ Újraküldés
+ Megjelöl
+ Nem jelöl
+ Válasz
+ Válasz mindenkinek
+ Törlés
+ Archiválás
+ Levélszemét
+ Mappa törlése
+ Továbbítás
+ Áthelyez
+ Folytatás
+ Rendben
+ Töröl
+ Mégsem
+ Piszkozat
+ Újból
+ Frissít
+ Levelek frissítése
+ Üzenet küldése
+ Mappa lista
+ Mappák frissítése
+ Mindent olvasottnak jelöl
+ Új fiók
+ Levélírás
+ Keresés
+ Keresés eredménye
+ Beállítások
+ Megnyit
+ Fiók beállításai
+ Mappa beállításai
+ Általános beállítások
+ Fiók törlése
+ Függőben lévők törlése
+ Fiókok
+ ◀
+ ◀
+ Olvas
+ Olvasottnak jelöl
+ Megosztás
+ Küldő választása
+ Mindent olvasottnak jelöl
+ "A '%s' fiók minden üzenetét olvasottnak jelöli?"
+ Csillagos
+ Csillag törlése
+ Másolás
+ Mutassa a teljes fejlécet
+ Kompakt fejléc mutatása
+ Szöveg kijelölése
+ Olvasatlannak jelöl
+ Áthelyez a
+ Mappák
+ Részletek be/ki
+ Másolatot kap
+ Tárgy
+ Melléklet
+ Kép-melléklet csatolása
+ Videó-melléklet csatolása
+ Ideiglenes beállítások
+ Lomtár ürítése
+ Biztonságos törlés
+ Helyi üzenetek törlése
+ Sorbarendezés módja
+ Fordított sorrendben
+ Névjegy
+ Beállítások
+ Fiók beállításai
+ Mappa beállítási
+ (nincs tárgy)
+ Nincs dátum
+ Nincs feladó
+ Letöltés
+ (Letöltés %s%s)
+ Üzenetek betöltése…
+ Kapcsolódási hiba
+ Nincs ilyen üzenet
+ Hiba
+ Küldés
+ Hibás letöltések újratöltése
+ Az utolsó %d levél frissítése
+ GB
+ MB
+ KB
+ B
+ \"%s\" fiók tömörítése %s helyett %s
+ Fiók tömörítése \"%s\"
+ Fiók takarítása \"%s\"
+ A \"%sújbóli létrehozása
+ Új levél
+ Új levél %s -tól
+ %d Olvasatlan (%s)
+ %d Új üzenet (%s)
+ a %d fiókban
+ Levél nincs elküldve
+ Levelek ellenörzése: %s:%s
+ Levelek ellenörzése
+ Küldés a %s fiókkal
+ Levél küldése
+ :
+ Érkezett
+ Postázatlan
+ Piszkozat
+ Lomtár
+ Elküldött
+ Archivált
+ Levélszemét
+ %s
+ %s
+ %s
+ %s
+ %s
+ Néhány üzenetet nem sikerült elküldeni
+ Nézze meg a %s mappát a részletekért.
+ "A K-9 hibát észlelt üzenetküldés közben. A probléma miatt elképzelhető, hogy a levél nem érkezik meg, de az is lehet hogy igen.
+
+Az ilyen hibás leveleket csillag jelzi a postázandó mappában. Ha eltávolítja a csillagot a K-9 megpróbálja újból elküldeni a levelet. Hosszan a Postázatlan mappára kattintva válassza az Üzenetek küldését.
+
+ A %s tartalmaz küldéssel kapcsolatos hibákat."
+ K-9 riasztás
+ A szinkronizáció és a levélküldés felfüggesztve, hálozati kapcsolat hiánya miatt.
+ Nincs több üzenet
+ "Üdvözöljük a K-9 Mail beállításokban. A K-9 egy nyílt forráskódú levelezőprogram Androidra, a sima mail kliens alapjaira helyezve.
+
+K-9 továbbfejlesztett funkciói:
+ * Push mail using IMAP IDLE
+ * Jobb teljesítmény
+ * Message refiling
+ * E-mail aláírások
+ * Titkos másolat
+ * Mappa-előfizetések
+ * Minden mappa szinkronizálása
+ * Válasz cím beállítása
+ * Gyorsbillentyűk
+ * Jobb IMAP támogatás
+ * Mellékletek mentése a memóriakártyára
+ * Kuka ürítése
+ * Üzenetek válogatás
+ * ...és még sok más
+
+Magyarította: Deák Tamás (maya98) és RootRulez
+
+Vegye figyelembe, hogy a K-9 nem támogatja a legtöbb ingyenes hotmail fiókot és még sok más klienst. Történnek furcsaságok, ha Microsoft Exchange-el kommunikál.
+ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérdéseit itt teheti fel http://k9mail.googlecode.com/"
+ Verzió: %s
+ Hibakeresés
+ Extra diagnosztikai naplózás
+ Személyes adatok naplózása
+ Jelszavak naplózása
+ K-9 Levlező program Android rendszerhez
+ Minden levél
+ Legújabb üzenetek az összes fiókból
+ Minden beérkezett üzenet
+ %s:%s %s %s %s %s
+ Többi levél letöltése
+ a:%s
+ Törlés
+ Olvasottnak jelöl
+ Olvasattlannak jelöl
+ Csillagos
+ Csillag törlése
+ Címzett
+ Másolat
+ Titkos másolat
+ Tárgy
+ Levél szövege
+ -------- Eredeti levél --------
+ Tárgy:
+ Küldve:
+ Feladó:
+ Címzett:
+ Másolat:
+ "%s írta:
+
+"
+ Idézet
+ Legalább egy címzetted adjon meg.
+ E-mail cím nem található.
+ Néhány melléklet nem lett letöltve. Levélküldés előtt automatikusan letöltődnek.
+ Néhány mellékletet nem lehet továbbítani, mert nem lettek letöltve.
+ Feladó: %s <%s>
+ Címzett:
+ Másolat:
+ Megnyit
+ Mentés
+ ▼
+ ▲
+ Archivál
+ Áthelyez
+ Levélszemét
+ MMM dd yyyy hh:mm a
+ %s mellékletei a SD kártyára mentve.
+ Nem lehet a mellékletet az SD kártyára menteni.
+ Válassza a \"Képek mutatását\" a beágyazott képek megjelenítéséhez.
+ Képek mutatása
+ Melléklet letöltése.
+ %s nincs társítva semmihez.
+ Teljes üzenet letöltése
+ Nincs minden fejléc letöltve. Válassza a \"Minden levélfejléc letöltése\" opciót a bejövő szerverbeállításoknál.
+ Minden fejléc letöltve, de nincs mind megjelenítve.
+ Nem sikerült betölteni az összes fejlécet adatbázishiba, vagy email szerver hiba miatt.
+ Mappák
+ Új mappa
+ Új mappa neve
+ (Push)
+ Összes ettől a feladótol
+ Levél átmásolva
+ Levél áthelyezve
+ Levél törölve
+ Levél eldobva
+ Levél mentve a piszkozatokba
+ Levél törlése nem sikerült
+ Névjegy %s
+ Verzió: %s
+ Csillagok
+ Csillag jelzi a fontos leveleket
+ Többszörös kijelölés
+ Kijelölő négyzetet a levelek mellet
+ Levelek előnézete
+ Üzenetek bővített előnézete
+ Előnézeti sorok száma
+ Nevek mutatása
+ Ha a címtárban szerepel az email cím, a hozzá tartozó név megjelenítése
+ Névjegyek mutatása
+ Használja a címzettek nevét ha címtárban szerepel
+ Névjegyek színe
+ Ne használjon színeket a névjegyzékben
+ Színek használata a névjegyzékben
+ Fix szélleségű betűk
+ Fix szélességű betűtípus használata a sima szöveges üzeneteknél
+ Visszalépés törlés után
+ Törlés után visszalép a levelek listájára
+ Parancsok megerősítése
+ Üzenet megjelenítése a parancs végrehatása előtt
+ Archivál
+ Törlés (csak üzenetek nézet)
+ Levélszemét
+ Összes megjelölése olvasottként
+ Küldés
+ Képernyőzár értesítések
+ Lezárt képernyőnél ne mutassa a levelek tárgyát a állapotsoron
+ Csendes mód
+ Éjszakára kikapcsolja a jelzőhangokat, rezgést, villogást
+ Csendes mód kezdete
+ Csendes mód vége
+ Új fiók létrehozása
+ A fiókhoz használt email cím:
+ (Másik %d fiók létrehozása.)
+ Email cím
+ %s nem mefelelő formátumú email cím.
+ %s már egy létezik.
+ Jelszó
+ Ez legyen az alapértelmezett levélküldő
+ Kézi beállítás
+
+ Fiók adatainak ellenörzése…
+ Bejövő szerver tesztelése…
+ Kimenő szerver tesztelése…
+ Hitelesítés…
+ Fiók adatainak letöltése…
+ Befejezés…
+ Megszakítás…
+ Majdnem kész!
+ Az ön fiókja használatra kész, még pár személyes adat hiányzik!
+ Adjon a fióknak nevet (nem kötelező):
+ Adja meg a nevét (elküldött leveleknél ez jelenik meg):
+ "A fiókbeállítások sikerültek!
+
+Levelek letöltése…"
+ Fiók típusa
+ Kiszolgálótípus
+ POP3
+ IMAP
+ Exchange (WebDAV)
+ Bejövő szerver
+ Felhasználónév
+ Jelszó
+ POP3 szerver
+ IMAP szerver
+ Exchange szerver
+ Port
+ Kapcsolat biztonsága
+ Hitelesítés típus
+ Nincs
+ SSL (ha elérhető)
+ SSL (mindig)
+ TLS (ha elérhető)
+ TLS (mindig)
+ Üzenet törlésekor
+ Ne törlődjön a szerverről
+ 7 nap múlva
+ Törlődjön a szerverről
+ Jelölje olvasottnak
+ Használjon tömörítést a hálózaton:
+ Mobil
+ Wi-Fi
+ Egyéb
+ Fejlécek letöltése
+ Minden levélfejléc letöltése
+ Külső tárhely (SD kártya)
+ Belső memória
+ %1$s egyéb belső tároló
+ Levelek tárolási helye
+ Biztonságos törlés véglegesítése
+ Azonnal
+ Frissítés után
+ Kézileg
+
+ IMAP útvonal prefix
+ Piszkozatok mappája
+ Elküldöttek mappája
+ Lomtár mappája
+ Archiváltak mappája
+ Levélszemét mappája
+ Csak a megjelölt mappákat
+ Minden mappa kibontása
+ OWA útvonal
+ Választható
+ Hitelesítési útvonal
+ Választható
+ Mailbox álnév
+ Választható
+ Kimenő szerver beállításai
+ SMTP szerver
+ Port
+ Kapcsolat biztonsága
+ Nincs
+ SSL
+ TLS (ha lehetséges)
+ TLS (mindig)
+ Bejelentkezés szükséges
+ Felhasználónév
+ Jelszó
+ Hitelesítés típusa
+ Felhasználónév & jelszó
+ Felhasználónév
+ Jelszó
+ POP az SMTP előtt
+ IMAP az SMTP előtt
+ WebDAV (Exchange) az SMTP előtt
+ Hibás beállítás: %s
+ Fiók beállításai
+ Tömörítés
+ Üzenetek törlése!
+ Adatok helyreállítása
+ Új levelek ellenőrzése
+ Soha
+ 1 percenként
+ 5 percenként
+ 10 percenként
+ 15 percenként
+ 30 percenként
+ Minden órában
+ 2 óránként
+ 3 óránként
+ 6 óránként
+ 12 óránként
+ 24 óránként
+ Küldéskor új levelek letöltése
+ Azonnali levélfogadás engedélyezése
+ Ha a szerver támogatja, azonnal értesítést kapunk az érkező levelekről. Ez az opció csökkenti a telefon teljesítményét.
+ Frissítés tétlen kapcsolatkor
+ Percenként
+ 2 percenként
+ 3 percenként
+ 6 percenként
+ 12 percenként
+ 24 percenként
+ 36 percenként
+ 48 percenként
+ 60 percenként
+ Ez az alapértelmezett levélküldő fiók
+ Értesítés email érkezésekor
+ Értesítés adatszinkronizáláskor
+ Látható levelek száma
+ 10 levél
+ 25 levél
+ 50 levél
+ 100 levél
+ 250 levél
+ 500 levél
+ 1000 levél
+ Minden levél
+ Ez a levél nem másolható illetve mozgatható máshova, mert nincs szinkronizálva a szerverrel.
+ A konfigurálás nem sikerült
+ "Felhasználónév vagy a jelszó hibás.
+(%s)"
+ "Nem lehet biztonságosan kapcsolódni a szerverhez.
+(%s)"
+ "Nem lehet kapcsolódni a szerverhez.
+(%s)"
+ Módosítás
+ Tovább
+ Haladó
+ Fiók beállításai
+ Alapértelmezett fiók
+ Alapértelmezett fiók
+ Levélküldéskor ez a fiók az alapértelmezett
+ Értesítés új levélnél
+ Értesítés szinkronizálásnál
+ Az email címe
+ Értesítés az állapotsoron ha új levél érkezett
+ Értesítés az állapotsoron adatszinkronizálásánál
+ Összevont beérkezett üzenetek
+ Értesítés küldéskor
+ Mutassa az állapotsoron ha a küldés sikeres volt
+ Értesítés megnyitása
+ Értesítésre kattintva megnyitja az olvasatlan üzeneteket
+ Olvasatlanok kijelzése
+ Olvasatlan levelek száma az állapotsoron.
+ Görgetés iránygombokkal
+ Soha
+ Ha van billentyűzet
+ Mindig
+ Művelet gombok megjelenítése
+ Mutassa a Mozgatás, Archív és Levélszemét gombokat
+ Művelet gombok görgetése
+ Képek megjelenítése
+ Soha
+ Csak az ismerősökét
+ Mindig
+ Levelek küldése
+ Válasz az idézet után
+ Válaszlevélnél az eredeti üzenet fent jelenik meg
+ Levél formátuma
+ Sima szöveg (képek és formázás nélkül)
+ HTML (képekkel és formázással)
+ Válaszlevél stílusa
+ Előtag (pl. Gmail, Pine)
+ Fejléc (pl. Outlook, Yahoo!, Hotmail)
+ Általános beállítások
+ Fiók testreszabása
+ Levelek letöltése
+ Mappák
+ Levelek listázása
+ Levelek megjelenítése
+ Idézett szöveg előtagja
+ Titkosítás
+ OpenPGP Provider
+ None
+ nem elérhető
+ Auto aláírás
+ Használja az email címet a titkosítási kulcshoz
+ Frissítés gyakorisága
+ Másodlagosak frissítési gyakorisága
+ Tárolás
+ Fiók színe
+ Válasszon egyéni színt a fiókhoz
+ Figyelmeztető LED színe
+ Telefon LED színe figyelmeztetéskor
+ Helyi mappa mérete
+ Letölthető levélméret
+ 1Kb
+ 2Kb
+ 4Kb
+ 8Kb
+ 16Kb
+ 32Kb
+ 64Kb
+ 128Kb
+ 256Kb
+ 512Kb
+ 1Mb
+ 2Mb
+ nincs korlátozva
+ Dátum szerint
+ mindent (nincs időkorlát)
+ csak a maiak
+ elmúlt 2 nap
+ elmúlt 3 nap
+ elmúlt hét
+ elmúlt 2 hét
+ elmúlt 3 hét
+ elmúlt hónap
+ elmúlt 2 hónap
+ elmúlt 3 hónap
+ elműlt 6 hónap
+ az elmúlt év
+ Megjelenítendő mappák
+ Összes
+ Csak az elsődleges
+ Első és Másodlagosak
+ Minden, kivéve a Másodlagosak
+ Letöltendő mappák
+ Összes
+ Csak az elsődlegesek
+ Első és Másodlagosak
+ Minden, kivéve a Másodlagosak
+ Nincs
+ Azonnali levélfogadás
+ Minden
+ Csak az Elsődleges mappák
+ Első és Másodlagos mappák
+ Minden, kivéve a Másodlagosak
+ Nincs
+ Áthelyezés/másolás a célmappába
+ Minden
+ Csak az elsődlegesek
+ Első és Másodlagosak
+ Minden, kivéve a Másodlagosak
+ Szerver oldali törlések
+ Törölje a helyi üzeneteket ha a szerveren törlődtek
+ Mappa beállításai
+ Megjelenítés a fenti csoportban
+ Mutassa a mappa lista tetjén
+ Osztályozott mappanézet
+ Nincs
+ Elsődleges
+ Másodlagos
+ Osztályozott szinkronizálás
+ Nincs
+ Elsődleges
+ Másodlagos
+ Az aktuális osztály
+ Osztályozott küldés
+ Nincs
+ Elsődleges
+ Másodlagos
+ Mint a szinkronizált
+ Bejövő szerver
+ Beérkező levélszerver konfigurálása
+ Kimenő szerver
+ Levélküldő szerver konfigurálása (SMTP)
+ Másik fiók létrehozása
+ Fiók neve
+ Az ön neve
+ Értesítések
+ Csengetés levél érkezésekor
+ Rezgés
+ Rezgés levél érkezésekor
+ Rezgés típusa
+ alapértelmezett
+ rezgésminta 1
+ rezgésminta 2
+ rezgésminta 3
+ rezgésminta 4
+ rezgésminta 5
+ Rezgés ismétlése
+ Új levél csengőhangja
+ LED villogása
+ Villogtatja a LED-et új levél érkezésekor
+ Szerver beállításai
+ Levélírás beállításai
+ Szerkesztési alapbeállítások
+ Egyéni aláírás készítése
+ Személyes adatok
+ Alternatív cím és aláírás létrehozása
+ Személyazonosság
+ Személyazonosság
+ Adataim szerkesztése
+ Új személyazonosság
+ Titkos másolat készítése
+ Az összes elküldött levelélről titkos másolatot küld
+ Szerkeszt
+ Fentebb
+ Lentebb
+ Legfelülre / alap.
+ Töröl
+ Személyazonosság részletei
+ (Opcionális)
+ Az ön neve
+ (Opcionális)
+ Email cím
+ (Kötelező)
+ Válaszcím
+ (Opcionális)
+ Aláírás
+ (Opcionális)
+ Aláírás használata
+ Aláírás
+ Az aláírás hozzáfűzése minden elküldött levélhez
+ "--
+Ezt a levelet mobiltelefonról küldtem, K-9 Mail-el. Elnézést a levél rövidségéért és az esetleges hibákért."
+ Elsődleges személyazonosságom
+ Személyazonosság választása
+ Személyazonosság választása
+ Válasszon fiókot/személyazonosságot
+ Küldés más néven
+ Menjen a Fiók beállításai -> Személyazonosság kezelése és hozzon létre eggyet.
+ Nem tudja eltávolítani, egy azonosítónak lennie kell
+ Nem tudja használni az azonosítót email cím nélkül
+ Az ön aláírása és azonosítója nincs mentve, átkerült a piszkozatokba.
+ Korábbi leveleket előre
+ Későbbi levelket előre
+ Feladó szerint sorban
+ Feladó szerint fordítva
+ Tárgy szerint sorban
+ Tárgy szerint fordítva
+ Csillagos levelek előre
+ Csillag nélküliek előre
+ Olvasatlanok előre
+ Olvasottak előre
+ Mellékletes levelek előre
+ Melléklet nélküliek előre
+ Rendezés...
+ Dátum
+ Feladó
+ Tárgy
+ Csillag
+ Olvasott
+ Melléklet
+ %s
+ Fiók törlése
+ A \"%s\" fiók törölve a K9 Mail-ból.
+ Fiók újbóli létrehozása
+ Az összes üzenet, melléklet, mappa és beállításai törlődni fognak a \"%s\" fiókból. A fiók beállításai megmaradnak.
+ Fiók tisztítása
+ Minden levél törlődni fog a \"%s\" fiókból, de a beállítások megmaradnak.
+ Csak néhány \"Plusz\" postafiók tartalmaz POP hozzáférést. Ha nem tud bejelentkezni a helyes jelszavával, akkor lehet nem fizett elő a \"Plusz\" postafiókra. Kérem használja a webes felülelet hogy hozzáférjen a fiók leveleihez.
+ Ha POP3-at szeretne használni ehhez a szolgáltatóhoz, akkor engedélyezze a Yahoo mail beállításai oldalon.
+ Ha POP3-at vagy IMAP-ot szeretne használni ehhez a szolgáltatóhoz, akkor engedélyeznie kell az IMAP vagy POP3 beállításokat a Naver oldalán.
+ Ha POP3-at vagy IMAP-ot szeretne használni ehhez a szolgáltatóhoz, akkor engedélyeznie kell az IMAP vagy POP3 beállításokat a Hanmail(Daum) oldalán.
+ Ha POP3-at vagy IMAP-ot szeretne használni ehhez a szolgáltatóhoz, akkor engedélyeznie kell az IMAP vagy POP3 beállításokat a Paran oldalán.
+ Ha POP3-at vagy IMAP-ot szeretne használni ehhez a szolgáltatóhoz, akkor engedélyeznie kell az IMAP vagy POP3 beállításokat a Nate oldalán.
+ Felismerhetetlen tanúsítvány
+ Kulcs elfogadva
+ Kulcs elutasítva
+ "Del (or D) - Delete
+R - Reply
+A - Reply All
+F - Forward
+J or P - Previous Message
+K, N - Next Message
+M - Move
+Y - Copy
+Z - Zoom Out
+Shift-Z - Zoom In
+G - Star"
+ "Del (or D) - Delete
+R - Reply
+A - Reply All
+C - Compose
+F - Forward
+M - Move
+Y - Copy
+G - Star
+O - Sort type
+I - Sort order
+Q - Return to Folders
+S - Select/deselect"
+ "1 - Display only 1st Class folders
+ 2 - Display 1st and 2nd Class folders
+ 3 - Display all except 2nd Class folders
+ 4 - Display all folders
+ Q - Return to Accounts
+ S - Edit Account Settings"
+ Mappák megjelenítése
+ Minen mappa
+ Csak az Elsődleges
+ Első és Másodlagos
+ Mind, kivéve a Másodlagost
+ Aláírás helyzete
+ Idézett szöveg elé
+ Idézett szöveg után
+ Sötét
+ Világos
+ Megjelenés beállításai
+ Általános beállítások
+ Hibakeresés
+ Titoktartás
+ Adatszinkronizálás
+ Működési beállítások
+ Fiókok listája
+ Levelek listája
+ Levélírás
+ Téma
+ Nyelv
+ Egy oszlopos elrendezés
+ HTML üzenetek újraformázása a kisebb kijelzőkhöz.
+ Rendszer nagyító használta
+ Engedélyezi a multi touch nagyítást és a nagyító widgeteket.
+ Alapértelmezett
+ Háttérszinkronizálás
+ Soha
+ Mindig
+ "Ha a 'Háttéradatok' bekapcsolva"
+ "Ha a 'Háttéradatok' és 'Auto-szink' bekapcsolva"
+ Nincs levél kiválasztva
+ Dátum formátuma
+ SHORT
+ MEDIUM
+ dd-MMM-yyyy
+ yyyy-MM-dd
+ Kötegelt feladatok
+ Kijelöltek törlése
+ Kijelöltek olvasottnak jelöl
+ Kijelöltek olvasottlannak jelöl
+ Csillag hozzáadása
+ Csillag törlése
+ Kijelöltek archiválása
+ Kijelöltek levélszemétnek
+ Kijelöltek áthelyezése
+ Kijelöltek másolása
+ Csillag mód
+ Kijelölés mód
+ Egyszerű mód
+ Mindent kijelöl
+ Kijelölések megszüntetése
+ Ellenőrízhető mappák száma
+ 10 mappa
+ 25 mappa
+ 50 mappa
+ 100 mappa
+ 250 mappa
+ 500 mappa
+ 1000 mappa
+ Animációk
+ Áttünési effektusok használata.
+ Kézmozdulatok
+ Engedélyezi a kézmozdulakkal való vezérlést.
+ Kompakt elrendezés
+ Adjust layouts to display more on each page
+ Hangerő gomb vezérlés
+ Léptetés az hangerő gombokkal
+ Leveleknél
+ Lista nézetek váltása
+ A \"Vissza\" gomb működése
+ Használva lépjen vissza egy szintet
+ Kezdőlap az Összevont mappa
+ Összes beérkezett levél mappa jelenjen meg indításkor
+ Mutassa a fiókok méretét
+ Kikapcsolva gyorsabb működés
+ Számolja a keresés eredményét
+ Kikcsapcsolva gyorsabb műkodés
+ Különleges fiókok elrejtése
+ Egységesen elrejti a fiókok bejövő mappáit
+ %s %s
+ - Csillagos
+ - Olvasatlan
+ Minden levél
+ Az összes levél egy helyen
+ Összes beérkezett levél
+ Minden üzenet egy helyen
+ Érintse meg a borítékot vagy a csillagot a kijelölésekhez
+ Egyesítés
+ Minden üzenetet az Összes beérkezett mappába
+ Keresés ezekben mappákban
+ Mind
+ Látható
+ Semmi
+ K-9 Mail távoli vezérlés
+ Lehetővé teszi, hogy az alkalmazás módosítsa a K9 mail beállításait.
+ Betűméret
+ Betűméretek beállításai
+ Fiókok listája
+ Fiók neve
+ Fiók részletei
+ Mappák listája
+ Mappa neve
+ Mappa státuszta
+ Levelek listája
+ Tárgy
+ Feladó
+ Dátum
+ Előnézet
+ Levelek megjelenítése
+ Feladó
+ Címzett
+ Másolatot kap
+ További fejlécek
+ Tárgy
+ Idő
+ Dátum
+ Üzenet szövege
+ Mini
+ Pici
+ Kisebb
+ Kicsi
+ Közepes
+ Nagy
+ Nagyobb
+ Kisebb
+ Kicsi
+ Normál
+ Nagyobb
+ Legnagyobb
+ Kapcsolja be a \"Beállítások\" -> \"Galéria hiba\" ha 3D galériából akar képet mellékelni.
+ Használja a \"Kép csatolása\" vagy \"Videó csatolása\" opciót ha 3D galériából szeretne választani.
+ Egyéb
+ Galéria hiba kikerülése
+ Gombok megjelenítése a kép/videó csatoláshoz (a 3D Galéria hiba kikerülése érdekében)
+ Nincs megfelelő alkalmazás ehhez a művelethez.
+ A telepített APG verzió nem támogatott.
+ Aláírás
+ Titkosítás
+ Dekódolás
+ Ellenőrzés
+ <ismeretlen>
+ azonosító: %s
+ A K-9-nek nincs hozzáférési joga az APG-hez. Kérem telepítse újra a K-9 Mail.
+ PGP/MIME üzenetek még nem támogatottak.
+ Figyelem: a mellékletek nincsenek aláírva vagy nem titkosítottak.
+ Küldés megszakítva.
+ Menti piszkozatként?
+ Menti vagy mégsem az üzenetet?
+ Ez az üzenet nem jeleníthető meg, mert a \"%s\" kódlap nem található.
+ Szöveg kijelölése.
+ Törlés megerősítése
+ Biztos hogy törli ezt a levelet?
+ Törlés
+ Nem törlöm
+ Levélszemét mappa áthelyzésének jóváhagyása
+ Valóban át szeretné helyezni?
+ Igen
+ Nem
+ Csatolmányok letöltése
+ Hibakereső naplózás bekapcsolva
+ »
+ ›
+ Nem lehet kapcsolódni.
+ \"%s\" fiók nem elérhető ellenőríze a tárhelyet
+ Csatolményok mentése ide:
+ Csatolményok mentése
+ Nincs fájlkezelő. Hova szeretné mentni a csatolmányt?
+
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index f6ed42781..c5d96f662 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -6,9 +6,7 @@
Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project.Rilasciato sotto Licenza Apache, Versione 2.0.Autori: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesInformazioni: %s
- http://code.google.com/p/k9mail/Ci avvaliamo delle seguenti librerie di terze parti: %sIcone emoji: %s
@@ -85,8 +83,6 @@
Rimuovi accountAnnulla tutte le azioni in corso (pericolo!)
-
-
Account◀◀
@@ -112,6 +108,9 @@
Mostra/nascondi dettagliAggiungi Cc/CcnModifica oggetto
+ Notifica di lettura
+ Notifica di lettura attiva
+ Notifica di lettura disattivaAggiungi allegatoAggiungi allegato (Immagine)Aggiungi allegato (Video)
@@ -270,8 +269,7 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Alcuni allegati non sono stati scaricati. Verranno scaricati automaticamente prima che questo messaggio venga inviato.Alcuni allegati non possono essere inoltrati in quanto non sono stati scaricati.
-
-
+
Da: %s <%s>A:
@@ -291,7 +289,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Recupero allegato in corso.Impossibile trovare un visualizzatore per %s.
-
Scarica intero messaggio
@@ -318,7 +315,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Informazioni su %sVersione: %s
-
Mostra stelleLe stelle indicano i messaggi evidenziatiCaselle di selezione multipla
@@ -338,6 +334,8 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Usa font a larghezza fissa quando mostri i messaggi di testoTorna all\'elenco dopo l\'eliminazioneRitorna all\'elenco dei messaggi dopo l\'eliminazione del messaggio
+
+
Conferma azioniMostra una finestra di dialogo ogni volta che si eseguono le azioni selezionate
@@ -350,13 +348,11 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Notifiche con blocco dello schermoNon visualizzare l\'oggetto del messaggio nella barra di notifica quando il sistema è bloccato
-
Silenzioso a tempoDisabilita chiamata, vibrazione e lampeggi di notteAttiva alleDisattiva alle
-
Configura un nuovo accountInserisci l\'indirizzo e-mail di questo account:(Puoi aggiungere altri %d account)
@@ -428,8 +424,8 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Durante ogni recuperoSolo manualmente
+
Prefisso percorso IMAP
- (Automatico usando NAMESPACE se disponibile)Cartella BozzeCartella Posta inviata
@@ -520,7 +516,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
1000 messaggitutti i messaggi
-
Non è possibile copiare o spostare un messaggio che non sia sincronizzato con il serverImpossibile completare la configurazione
@@ -564,6 +559,9 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Composizione messaggio
+
+
+
Risposta dopo testo quotatoQuando si risponde ai messaggi, il messaggio originale viene visualizzato sopra la tua risposta.
@@ -571,6 +569,9 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Plain Text (verranno rimosse immagini e formattazione)HTML (immagini e formattazione verranno preservate)
+ Notifica di lettura
+ Richiedi sempre la notifica di lettura
+
Aspetto testo quotato nelle rispostePrefisso (come Gmail, Pine)Intestazione (come Outlook, Yahoo!, Hotmail)
@@ -594,7 +595,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Memorizzazione
-
Colore dell\'accountScegli il colore dell\'account utilizzato nell\'elenco delle cartelle e degli account
@@ -616,6 +616,8 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
512KB1MB2MB
+ 5MB
+ 10MBqualsiasi dimensione (nessun limite)Sincronizza messaggi da
@@ -632,7 +634,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
gli ultimi 6 mesil\'ultimo anno
-
Visualizza cartelleTutteSoltanto cartelle di 1a Classe
@@ -707,7 +708,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
LED lampeggianteLED lampeggiante quando arriva un messaggio
-
Impostazioni del serverOpzioni composizione messaggi
@@ -755,7 +755,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Scegli account/identitàInvia come
-
Vai a Impostazioni account -> Gestione identità per creare identitàNon è possibile rimuovere la propria unica identitàNon è possibile utilizzare una identità senza un indirizzo e-mail
@@ -797,8 +796,11 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
indirizzo email e password corretti, è possibile che non sia stato pagato un account
\"Plus\". Esegui il browser Internet per acquistare l\'accesso a questo
genere di account e-mail.
-
Se si desidera utilizzare POP3 per questo provider, si deve consentire l\'utilizzo di POP3 sulla pagina delle impostazioni di Yahoo.
+
+
+
+
Certificato non riconosciutoAccetta chiave
@@ -827,8 +829,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Visualizza cartelle di 1a e 2a ClasseVisualizza tutte eccetto le cartelle di 2a Classe
-
-
Posizione della firmaPrima del testo quotatoDopo il testo quotato
@@ -851,8 +851,6 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Zoom di sistemaAbilita widgets dello zoom o pinch-zoom se il dispositivo lo supporta
-
-
Impostazioni predefinite di sistemaSincronizzazione in background
@@ -1027,7 +1025,20 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
Non eliminare
-
+
@@ -1039,9 +1050,55 @@ Benvenuto nella configurazione della posta di K-9. K-9 è un client di posta ope
›Impossibile connettersi.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b660fcc9b..09390e472 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -6,9 +6,7 @@
Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project.Licensed under the Apache License, Version 2.0.Authors: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesRevision Information: %s
- http://code.google.com/p/k9mail/以下のライブラリを利用しています: %s絵文字アイコン: %s
@@ -62,6 +60,7 @@
転送移動継続
+ 戻る完了取除く破棄
@@ -85,8 +84,6 @@
アカウント削除保留中のアクションをクリア (危険!)
-
-
アカウント一覧\u25c0\u25c0
@@ -111,6 +108,9 @@
詳細の表示/非表示Cc/Bcc追加件名編集
+ 開封確認
+ 開封確認を要求します
+ 開封確認を要求しません添付追加添付ファイル追加 (画像)添付ファイル追加 (動画)
@@ -269,8 +269,7 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
メールアドレスが登録されていません一部の添付ファイルをダウンロードしていません。このメールが送信される前に自動的にダウンロードされます。ダウンロードしていないため、一部の添付ファイルを転送することはできません。
-
-
+ 元のメッセージを引用する送信者: %s <%s>宛先:
@@ -316,7 +315,6 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
%s についてバージョン: %s
-
スターを表示スターは印の付いたメッセージを示す複数選択チェックボックス
@@ -334,13 +332,16 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
固定幅フォントプレーンテキストメッセージの表示に固定幅フォントを利用
- 削除後メッセージ一覧へ戻る
+ 削除後メッセージ一覧に戻るメッセージの削除後、メッセージ一覧に戻る
+ 削除後次のメッセージを表示
+ メッセージの削除後、次のメッセージを表示する確認選択した動作を実行するときに常にダイアログを表示するアーカイブ削除(メッセージ表示画面のみ)
+ スター付きメッセージの削除 (メッセージ表示画面のみ)迷惑メールすべて既読にする送信
@@ -348,13 +349,11 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
スクリーンロック時の通知システムがロックされているときは通知バーにメッセージの表題を表示しない
-
夜間時間帯夜間での各種通知や表示を抑制する時間帯を設定開始時刻終了時刻
-
電子メールセットアップこのアカウントで使用するメールアドレスを入力して下さい(追加する場合は %d と異なるメールアドレスを入力して下さい)
@@ -426,8 +425,8 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
同期のタイミングで手動のみ
+ IMAP名前空間を自動検出IMAP ルートフォルダパス
- (可能であれば名前空間を自動的に使用)下書きフォルダ名送信済みフォルダ名
@@ -561,12 +560,22 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
メール送信
+ 返信時に元のメッセージを引用する
+ 返信するとき、元のメッセージをメールに挿入する
+
引用テキストの後に返信を書く返信するときに元のメッセージを返信の上に表示
+ 引用から署名を除く
+ メッセージの返信時に引用文にある署名を取り除く
+
メッセージの形式テキスト(画像や書式は取り除く)HTML (画像や書式を保持)
+ 自動 (HTMLメールに対する返信でなければテキスト)
+
+ 開封確認
+ 常に開封確認を要求する返信の引用スタイル引用記号 (Gmail, Pine形式)
@@ -585,13 +594,14 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
利用不可自動署名このアカウントのE-Mailアドレスから署名の鍵を自動的に決定する
+ 自動暗号化
+ 公開鍵が宛先と一致するなら自動的に暗号化する同期フォルダの同期間隔2nd クラス自動受信間隔ストレージ
-
アカウントの色アカウント一覧とフォルダで使用する色を選択
@@ -613,6 +623,8 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
512Kb1Mb2Mb
+ 5Mb
+ 10Mb上限なしいつから同期するか
@@ -629,7 +641,6 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
6ヶ月前1年前
-
表示するフォルダすべて1st クラスフォルダのみ
@@ -704,7 +715,6 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
LEDを点滅メール着信時にLEDを点滅
-
サーバ設定メール本文構成管理
@@ -752,7 +762,6 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
アカウント選択他のアカウントで送信
-
アカウント設定 -> 差出人情報管理 で差出人情報を作成してください最後の差出人情報は削除できませんメールアドレスの無い差出人情報は選択できません
@@ -819,8 +828,6 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
1st と 2nd クラスフォルダ表示2nd クラスフォルダを除くすべて表示
-
-
署名挿入場所引用テキストの前に挿入引用テキストの後に挿入
@@ -843,8 +850,6 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
ズーム制御デバイスが対応するならば、ズームウィジェットやピンチズームを有効にする
-
-
システム設定バックグラウンド同期
@@ -1009,6 +1014,12 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
メッセージの下書き保存メッセージを保存しますか?
+ 下書き保存の拒否
+ 暗号化したメッセージは下書き保存できません
+
+ 公開鍵なしでの続行
+ 宛先の公開鍵を持っていませんが、続けますか?
+
このメッセージに使われている文字セット \"%s\" は存在していません選択したテキストをコピーします
@@ -1019,7 +1030,16 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
削除しない迷惑メールフォルダへの移動の確認
- 本当にこのメッセージを迷惑メールフォルダに移動しますか?
+
+ 本当にこのメッセージを迷惑メールフォルダに移動しますか?
+ 本当にこれら%1$d件のメッセージを迷惑メールフォルダに移動しますか?
+
+ はいいいえ
@@ -1031,9 +1051,55 @@ K-9 Mail セットアップにようこそ。\nK-9 は標準のAndroidメール
\u203a接続できません
+ 設定のインポートとエクスポート
+ アカウント設定をエクスポート
+ 設定とアカウント情報をエクスポート
+ インポート
+ エクスポート
+ 設定をインポート
+ インポート項目の選択
+ グローバル設定
+ 設定をエクスポートしています...
+ 設定をインポートしています...
+ ファイルを調べています...
+ 設定を %s に保存しました。
+ グローバル設定を %s からインポートしました。
+ %s の設定を %s からインポートしました。
+
+ 1 アカウント
+ %s アカウント
+
+ 設定のエクスポートが失敗しました。
+ %s からのインポートに失敗しました。
+ エクスポート成功
+ エクスポート失敗
+ インポート成功
+ インポート失敗
+ アカウントを有効化
+ アカウント \"%s\" を有効にするために、%s を入力してください
+
+ サーバのパスワード
+ サーバのパスワード
+
+ 受信メールサーバ (%s):
+ 送信メールサーバ (%s):
+
+ パスワードを設定...
+ パスワードを設定...
+
+ 受信メールサーバパスワードを利用
+ 有効
+
+ バージョン %sのファイルは利用できません
+
アカウント \"%s\" は利用できません。ストレージを確認してください。添付ファイルの保存先添付ファイルの保存先ファイルブラウザがインストールされていません。添付ファイルの保存場所を直接入力してください。
+
+ 上に移動
+ 下に移動
+ アカウントを移動しています
+
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index fd4456bcf..bbc375844 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -2,29 +2,30 @@
K-9 메일K-9 메일 베타
+ Google, The K-9 Dog Walkers.
+ Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project.
+ Licensed under the Apache License, Version 2.0.Authors: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotes
- 수정 정보: %s
- http://code.google.com/p/k9mail/
+ 릴리즈 정보: %sK-9 메일은 아래의 서드파티 라이브러리를 이용합니다 : %sEmoji 아이콘: %s
-
+
첨부 읽기K-9이 이메일의 첨부를 읽도록 합니다이메일 읽기K-9이 이메일을 읽도록 합니다.이메일 삭제K-9이 이메일을 삭제하도록 합니다
-
- 정보 %s
+
+ %s계정고급%sK-9 계정
-
- %s:%s
- 쓰기
+ %s:%s
+
+ 작성디버그폴더 선택색 선택
@@ -39,7 +40,7 @@
\u0020%s/%s\u0020(다음 수신 @ %s)
- \u0020(동기화 불가능)
+ \u0020(동기화 실패)다음
@@ -80,8 +81,8 @@
폴더 설정환경 설정계정 삭제
- 예정된 작업 없애기(위험!)
-
+ 예정된 작업 삭제(위험!)
+
계정◀◀
@@ -91,10 +92,11 @@
발신자 선택모든 편지를 읽음으로 표시
- \'%s\' 폴더의 모든 메시지를 읽음으로 표시하시겠습니까? (K-9에서 보여지지 않은 폴더의 메시지포함)
+ \'%s\' 폴더의 모든 메시지를 읽은 메시지로 표시하시겠습니까?
+ (K-9에서 보여지지 않은 폴더의 메시지포함)
- 별표 붙이기
- 별표 삭제
+ 즐겨찾기 등록
+ 즐겨찾기 해제복사헤더 보기헤더 숨기기
@@ -106,6 +108,9 @@
세부내용 보기/숨기기 참조/숨은참조 추가제목 수정
+
+
+
첨부 추가첨부 추가 (이미지)첨부 추가 (비디오)
@@ -126,15 +131,15 @@
보낸이 없음수신중(수신 %s%s)
- 로딩중..\u2026
+ 이메일을 가져오는 중..\u2026연결 오류메시지를 찾을 수 없습니다오류
- 보내는 중
+ 전송중메시지 로딩 실패
- %d개 더 읽기
+ %d개 이메일 더 불러오기GBMB
@@ -154,7 +159,7 @@
새 이메일새 이메일 %s
- %d 개 읽지 않음 (%s)
+ %d 통의 읽지 않은 메일 (%s)%d 개 새 이메일 (%s)in %d accounts메시지가 전송되지 않았습니다
@@ -165,14 +170,14 @@
메일 전송중:
- 받은 메일함
- 보낸 메일함
+ 받은편지함
+ 보낸편지함
- 임시 메일함
+ 임시보관함휴지통
- 보낸 메일함
+ 보낸편지함보관
- 스팸메일함
+ 스팸편지함%s (임시보관함)
@@ -184,12 +189,12 @@
일부 메시지를 보내는데 실패하였습니다%s 폴더 자세히 보기K-9에서 메시지를 보내는데 문제가 발생하였습니다.
- 하지만 문제의 특성상 K-9은 메시지가 확실히 보내졌는지 여부를 확인할 수 없습니다.
- 수신자는 이미 메시지를 받았을 수도 있습니다.
- \u000a\u000a발생된 문제 유형의 메시지는 보낸편지함에 별표(started) 표시되었습니다.
- 이 별표를 없애면 K-9은 메시지를 재전송을 시도할것입니다.
- 다른 발신 작업을 하기위해서는 보낸편지함을 길게 눌러 메시지 보내기를 찾으십시오.\u000A\u000a
- %s 폴더에 실패에 대한 에러메시지가 있습니다.
+ 하지만 문제의 특성상 K-9은 메시지가 확실히 보내졌는지 여부를 확인할 수 없습니다.
+ 수신자는 이미 메시지를 받았을 수도 있습니다.
+ \u000a\u000a발생된 문제 유형의 메시지는 보낸편지함에 즐겨찾기(stared) 표시가 되어있습니다.
+ 이 즐겨찾기(stared)를 없애면 K-9은 메시지를 재전송을 시도할것입니다.
+ 다른 발신 작업을 하기위해서는 보낸편지함을 길게 눌러 메시지 보내기를 찾으십시오.\u000A\u000a
+ %s 폴더에 실패에 대한 에러메시지가 있습니다.
K-9 알람네트워크 문제로 동기화, 메일보내기가 지연되고있습니다.
@@ -197,9 +202,9 @@
더 이상 없음
-K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스 메일 클라이언트로 표준 안드로이드 메일 클라이언트를 기반으로 하였습니다.
+K-9 메일 설치를 환영합니다. K-9은 표준 안드로이드 메일 클라이언트를 기반으로 한 안드로이드용 오픈소스 메일 클라이언트 입니다.
\n
-\n\nK-9\'s 향상된 기능:
+\n\nK-9의 향상된 기능:
\n * IMAP IDLE를 이용한 메일 푸시(PUSH)기능
\n * 더 나은 성능
\n * 메시지 재정리
@@ -208,14 +213,14 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
\n * 폴더 구독
\n * 모든 폴더 동기화
\n * 회신주소 수정
-\n * 키보드 단축
-\n * 더 나은 IMAP 지원
+\n * 키보드 단축키
+\n * 향상된 IMAP 지원
\n * SD 카드에 첨부파일 저장
\n * 휴지통 비우기
\n * 메시지 정렬
\n * ...그리고 그 밖에
\n
-\nK-9 메일은 다른 메일 클라이언트와 마찬가지로 대부분의 무료 hotmail 계정을 Microsoft Exchange와 연결할때 발생되는 문제로 인해 지원하지 않습니다.
+\nK-9 메일은 다른 메일 클라이언트와 마찬가지로 대부분의 무료 hotmail 계정을 Microsoft Exchange와 연결할때 발생되는 문제로 인해 지원하지 않습니다.
\n
\n 버그 리포트, 새로운 기능 그리고 질문에 대한 문의는 http://k9mail.googlecode.com/ 로 남겨주시기바랍니다.
@@ -231,7 +236,7 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
모든 메일모든 계정의 모든 메시지
- 받은 편지함의 모든 메일
+ 받은편지함의 모든 메일%s:%s%s
@@ -243,8 +248,8 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
지우기읽음으로 표시읽지 않음으료 표시
- 별표 더하기
- 별표 지우기
+ 즐겨찾기 등록
+ 즐겨찾기 해제받는 사람참조
@@ -263,8 +268,7 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
이메일 주소를 찾을 수 없습니다.일부 첨부파일을 다운로드 할 수 없습니다. 이 메시지가 보내지기 이전에 자동적으로 다운로드 됩니다.다운로드 완료되지않은 일부 첨부파일을 보낼수 없습니다.
-
-
+
발신자: %s <%s>수신자:
@@ -284,7 +288,6 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
첨부파일 가져오는 중.%s에 대한 뷰어를 찾을 수 없습니다.
-
다운로드 완료 메시지
@@ -304,16 +307,15 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
복사됨이동됨삭제됨
- 버려짐
+ 삭제됨임시보관함에 저장되었습니다삭제 실패About %s버전: %s
-
- 별표 보기
- 체크된 메시지 별표하기
+ 즐겨찾기 보기
+ 체크된 메시지 즐겨찾기등록체크박스 여러게 선택하기여러게 선택하기를 항상보여줍니다.메시지 미리보기
@@ -331,6 +333,8 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
일반텍스트(Plain) 메시지를 보여줄때 고정 넓이 폰트사용삭제후 목록으로메시지 삭제후에 메시지 목록으로 되돌아갑니다.
+ 삭제 후 다음 메시지 보기
+ 메시지 삭제 후 다음 메시지를 보도록 기본값으로 설정합니다동작시 행동설정한 행동을 할 경우 확인창을 보여줍니다.
@@ -343,13 +347,11 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
잠긴화면에서 알림화면이 잠겨있을경우 메시지 수신시 제목을 화면에 보여주지 않습니다.
-
무음 시간벨소리, 부져, 플래쉬를 밤시간에 사용하지않습니다무음 시작 시간무음 끝나는 시간
-
계정 추가이메일 계정을 입력하시오:(%d개의 계정을 추가하였습니다.)
@@ -362,14 +364,14 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
계정 정보 복구\u2026
- 받기 서버 설정 확인중\u2026
- 보내기 서버 설정 확인중\u2026
+ 수신 서버 설정 확인중\u2026
+ 발신 서버 설정 확인중\u2026인증중\u2026계정설정 가져오기\u2026완료중\u2026취소중\u2026
- 거의 완료되었습니다!
+ 설정이 거의 완료되었습니다!계정이 설정되었습니다. 순조롭게 진행중입니다!이 계정의 이름을 입력 (옵션):이름 입력 (보내는 메시지에 표시 될 이름):
@@ -421,8 +423,8 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
수신시(poll)항상 수동적으로
+
IMAP path prefix
- (NAMESPACE가 이용가능할경우 자동으로 이용)임시보관함 폴더보낸 편지함 폴더
@@ -513,7 +515,6 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
1000 메시지모든 메시지
-
서버와 동기화 되지않은 메시지를 복사하거나 이동할 수 없습니다.설정이 완료되지 않았습니다
@@ -557,6 +558,9 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
메일 보내기
+
+
+
Reply after quoted text메시지 회신시 원본 메시지를 회신메시지에 포함시킵니다.
@@ -564,6 +568,9 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
일반 텍스트(Plain) (이미지와 꾸밈format은 없어집니다)HTML (이미지와 꾸밈format이 보존됩니다)
+
+
+
회신시 인용문 위치Prefix (Gmail, Pine 처럼)Header (Outlook, Yahoo!, Hotmail 처럼)
@@ -587,7 +594,6 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
저장장치
-
계정 색깔계정 목록과 폴더내에서 사용될 계정 색깔을 선택하시오.
@@ -609,6 +615,8 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
512Kb1Mb2Mb
+ 5Mb
+ 10Mbany size (제한없음)메시지 동기화 기간
@@ -625,7 +633,6 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
최근 6달최근 1년
-
보여질 폴더모든 폴더Only 1st Class folders
@@ -700,7 +707,6 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
LED 깜빡임메일 도착시 LED를 깜빡입니다.
-
서버 설정메시지 작성 옵션
@@ -748,7 +754,6 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
계정을 선택하시오다른 계정으로 보내기
-
신원 설정 가기 -> 새로운 신원(Identity) 생성을 위한 신원(Identity) 관리신원(Identity)를 제거할 수 없습니다.이메일 주소없이 신원(Identity)을 사용할 수 없습니다
@@ -760,8 +765,8 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
알파벳 순서의 역순제목의 알파벳 순서제목의 알파벳 순서의 역순
- 별표(stared) 메시지를 첫번째로
- 별표아닌(unstarted) 메시지를 첫번째로
+ 즐겨찾기(stared) 메시지를 첫번째로
+ 즐겨찾기아닌(unstarted) 메시지를 첫번째로읽지않은 메시지를 첫번째로읽은 메시지를 첫번째로첨부파일이 있는 메시지를 첫번째로
@@ -785,17 +790,15 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
계정 비우기\"%s\"의 모든 메일이 K-9에서 삭제될것입니다. 하지만 계정 설정은 보존됩니다.
- \"Plus\" 계정만이 이 프로그램을 POP 접근 하도록 허락합니다.
- 올바른 이메일 주소와 비밀번호로 로그인 실패할 경우 \"Plus\" 계정을 위해 유료전환 해야 할 것입니다.
- 웹브라우저를 통해 접근을 얻도록 하십시오
-
+ \"Plus\" 계정만이 이 프로그램을 POP 접근 하도록 허락합니다.
+ 올바른 이메일 주소와 비밀번호로 로그인 실패할 경우 \"Plus\" 계정을 위해 유료전환 해야 할 것입니다.
+ 웹브라우저를 통해 접근을 얻도록 하십시오POP3를 이용하기위해서는 야휴 메일 설정페이지에서 POP3 이용을 설정하여야합니다.
-
IMAP/POP3를 이용하기위해서는 네이버 메일 설정페이지에서 IMAP/POP3 이용을 설정하여야합니다.IMAP/POP3을 이용하기위해서는 한메일 환경설정 페이지에서 IMAP/POP3 이용을 설정하여야합니다.IMAP/POP3을 이용하기위해서는 파란 메일 환경설정 페이지에서 IMAP/POP3 이용을 설정하여야합니다.IMAP/POP3을 이용하기위해서는 네이트 메일 환경설정 페이지에서 IMAP/POP3 이용을 설정하여야합니다.
-
+
잘못된 인증정보Accept KeyReject Key
@@ -823,13 +826,11 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
Display 1st and 2nd Class foldersDisplay all except 2nd Class folders
-
-
서명 위치본문 앞에본문 뒤에
- 어두운 테마
- 밝은 테마
+ 어두운
+ 밝은화면Global디버깅
@@ -847,17 +848,15 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
시스템 줌 컨트롤Enable zoom widgets or pinch-zoom if your device supports it
-
-
시스템 기본값벡그라운드 동기화
- 절대 하지않음
+ 하지않음항상\'백그라운드 데이타\'가 선택된 경우\'백그라운드 데이타\'와 \'Auto-sync\'가 선택된 경우
- 아무 메시지도 선택되지않음
+ 선택된 메시지가 없습니다.날짜 형식
+
예아니오
@@ -1035,9 +1048,55 @@ K-9 메일 설치를 환영합니다. K-9은 안드로이드용 오픈소스
›연결실패
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\"%s\" 계정을 이용할 수 없습니다.; 저장장치를 확인하십시오.
- 첨부파일 저장위치
- 첨부파일 저장
- 파일 브라우져를 찾을 수 없습니다. 첨부파일을 저장할 경로를 입력하시오
+ 첨부파일 저장위치
+ 첨부파일 저장
+ 파일 브라우져를 찾을 수 없습니다. 첨부파일을 저장할 경로를 입력하시오
+
+ 위로
+ 아래로
+
+
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 2a0b8c70b..d1ffcb412 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -6,18 +6,16 @@
Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project.Licensed under the Apache License, Version 2.0.Auteurs: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesRevisie Informatie: %s
- http://code.google.com/p/k9mail/De volgende externe bibliotheken worden gebruikt: %sEmoji icons: %s
- Lees Email bijlage
- Sta deze applicatie toe de bijlage van emails te lezen.
- Lees Emails
- Sta deze aplicatie toe je Emails te lezen.
- Verwijder Emails
- Sta deze applicatie toe om je Emails te verwijderen.
+ Lees bijlage
+ Sta deze applicatie toe om bijlagen van e-mails te lezen.
+ Lees e-mails
+ Sta deze aplicatie toe om je e-mails te lezen.
+ Verwijder e-mails
+ Sta deze applicatie toe om je e-mails te verwijderen.Over %sAccounts
@@ -29,7 +27,7 @@
OntwerpFout opsporen
- Kies map
+ Kies een mapKies een kleur%s%s%s
@@ -48,7 +46,7 @@
VolgendeVorigeOK
- Annuleer
+ AnnulerenVerzendenOpnieuw VerzendenSelecteren
@@ -70,13 +68,13 @@
VernieuwenControleer mailVerstuur bericht
- Mappen lijst
+ MappenlijstVernieuw mappenMarkeer alle berichten als gelezenVoeg account toeNieuw berichtZoeken
- Zoek resultaten
+ ZoekresultatenInstellingenOpenAccount instellingen
@@ -85,8 +83,6 @@
Verwijder accountLeeg maken in afwachting van acties (gevaar!)
-
-
Accounts◀◀
@@ -96,7 +92,7 @@
Kies afzenderMarkeer alle berichten als gelezen
- Markeer alle berichten in \'%s\' als gelezen? (inclusief berichten in de map welke niet zichtbaar zijn in K-9)
+ Markeer alle berichten in \'%s\' als gelezen? (inclusief berichten in de map die niet zichtbaar zijn in K-9)Voeg ster toeVerwijder ster
@@ -111,6 +107,9 @@
Bekijk/ verberg detailsVoeg Cc/Bcc toeVerander onderwerp
+
+
+
Voeg bijlage toeVoeg bijlage toe (Afbeelding)Voeg bijlage toe (Video)
@@ -131,16 +130,15 @@
Geen afzenderPolling(Poll %s%s)
- Laden berichten\u2026
- Verbindings fout
+ Berichten laden\u2026
+ NetwerkfoutBericht niet gevondenFoutBezig met verzendenOpnieuw meer berichten laden
- Meer
- dan %d laden
+ Volgende %d berichtenGBMB
@@ -154,9 +152,9 @@
%s
- Verdichten account \"%s\"
- Wissen account \"%s\"
- Opnieuw instellen account \"%s\"
+ Account \"%s\" comprimeren
+ Account \"%s\" wissen
+ Account \"%s\" opnieuw instellenNieuwe mailNieuwe mail van %s
@@ -198,7 +196,7 @@
De %s map kan fout berichten bevatten over dit probleem.
K-9 waarschuwing
- Synchroniseren en verzenden is opgeschort wegens gebrek aan netwerk.
+ Synchroniseren en verzenden is gestopt omdat er geen verbinding is.Geen berichten meer
@@ -209,7 +207,7 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
\n * Push mail die IMAP IDLE gebruikt
\n * Betere prestaties
\n * Bericht heropenen
-\n * Email handtekeningen
+\n * E-mail handtekeningen
\n * Bcc naar jezelf
\n * Map abonnementen
\n * Alle mappen synchronisatie
@@ -228,7 +226,7 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Versie: %s
- Fout loggen toestaan
+ Fouten loggen toestaanLog extra diagnostische informatieLog gevoelige informatieKan wachtwoorden laten zien in logs.
@@ -258,19 +256,18 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
OnderwerpBericht tekst-------- Origineel bericht --------
- Subject:
+ Onderwerp:Verzonden:
- From:
- To:
+ Van:
+ Aan:CC:
- %s wrote:\n\n
+ %s schreef:\n\nGe-quote tekstMinimaal 1 ontvanger kiezen.
- Geen email adres gevonden.
- Sommige bijlage zijn niet gedownload. Deze worden automatisch gedownload voor dat dit bericht is verzonden.
- Sommige bijlagen kunnen niet worden doorgestuurd, omdat ze niet zijn gedownload.
-
-
+ Geen e-mailadres gevonden.
+ Sommige bijlagen zijn niet gedownload. Deze worden automatisch gedownload voor dat dit bericht is verzonden.
+ Sommige bijlagen kunnen niet worden doorgestuurd omdat ze niet zijn gedownload.
+
Van: %s <%s>Aan:
@@ -285,18 +282,17 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
MMM dd yyyy hh:mm aBijlage opgeslagen op SD-kaart als %s.Opslaan bijlage op SD-kaart mislukt.
- Selecteer \"Laat afbeeldingen zien\" om de omsloten afbeeldingen te laten zien.
+ Selecteer \"Laat afbeeldingen zien\" om de afbeeldingen te laten zien.Laat afbeeldingen zien
- ophalen bijlage.
+ bijlage ophalen.Niet in staat viewer te vinden voor %s.
-
Download compleet berichtNiet alle headers zijn gedownload of opgeslagen. Selecteer \"Sla alle headers lokaal op\" in de account\'s inkomende server instellingen om dit in te schakelen voor de toekomst.Alle headers zijn gedownload, maar er zijn geen extra headers aan te tonen.
- Het ophalen van extra headers uit de database of e-mail server is mislukt.
+ Het ophalen van extra headers uit de database of e-mailserver is mislukt.MappenNieuwe map
@@ -317,7 +313,6 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Over %sVersie: %s
-
Bericht sterrenSterren geven gemarkeerde berichten aanMulti-selecteer selectieboxen
@@ -326,7 +321,7 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Ruimere lijst items met bericht voorbeeldenPreview regelsToon naam bij bericht
- Geef bij voorkeur naam van afzender/geadresseerde weer i.p.v. email adres
+ Geef bij voorkeur naam van afzender/geadresseerde weer i.p.v. e-mailadresToon naam uit contactenlijstGeef de naam weer uit het adresboekKleuren contacten
@@ -337,6 +332,8 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Gebruik een lettertype met vaste breedte bij het weergeven van plain-tekstberichtenTerug naar lijst na verwijderenTerug naar de berichtenlijst na bericht verwijderen
+
+
Bevestig actiesToon een dialoogvenster altijd wanneer u de geselecteerde acties uitvoerd
@@ -349,18 +346,16 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Lock-screen meldingenNiet weergegeven onderwerp van het bericht in de notificatie bar als het systeem is vergrendeld
-
StilteperiodeSchakel beltoon, vibratie en leds uit gedurende de nachtStilteperiode startStilteperiode eindigt
-
Een nieuwe account instellen
- Toets het email adres in van deze account:
+ Toets het e-mailadres in van deze account:(Je mag meer %d accounts toevoegen.)
- Email adres
- %s is geen geldig email adres.
+ E-mailadres
+ %s is geen geldig e-mailadres.%s is al toegevoegd.WachtwoordVerzend mail standaard vanaf deze account
@@ -414,7 +409,7 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Wi-FiAnders
- Downloaden van email headers
+ Downloaden van e-mailheadersSla alle headers lokaal opExterne opslag (SD kaart)
@@ -427,8 +422,8 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Tijdens iedere pollAlleen handmatig
+
IMAP pad voorvoegsel
- (Automatisch gebruiken van NAMESPACE wanneer deze beschikbaar is)Ontwerpen map naamVerzonden map naam
@@ -519,7 +514,6 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
1000 berichtenalle berichten
-
Kan bericht niet kopiëren of verplaatsen omdat deze niet gesynchroniseerd is met de serverSetup kon niet afronden
@@ -536,7 +530,7 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Standaard mail verzenden vanaf deze accountNieuwe mail notificatieSync notificatie
- Jou email adres
+ Je e-mailadresNotificatie in statusbalk wanneer nieuwe mail binnenkomtNotificatie in statusbalk wanneer wordt gecontroleerd op nieuwe mailLaat gecombineerde Inbox zien
@@ -563,6 +557,9 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Schrijven berichten
+
+
+
Antwoorden na quoteWanneer u antwoord op berichten, zal het originele bericht boven uw antwoord staan.
@@ -570,6 +567,9 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Platte Tekst (plaatjes en formattering worden verwijderd)HTML (plaatjes en formattering blijven behouden)
+
+
+
Quotestijl bij antwoordenPrefix (zoals Gmail, Pine)Header (zoals Outlook, Yahoo!, Hotmail)
@@ -586,14 +586,13 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Geenniet beschikbaarAuto-ondertekenen
- Gebruik het account email adres om de digitale sleutel te raden.
+ Gebruik het e-mailadres van je account om de digitale sleutel te raden.Mappen poll controleer frequentie2e klasse controleer frequentieOpslag
-
Account kleurKies de kleur van het account gebruikt in mappen en account lijst
@@ -615,6 +614,8 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
512Kb1Mb2Mb
+ 5Mb
+ 10Mbelke grootte (geen limiet)Sync berichten van
@@ -631,7 +632,6 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
afgelopen 6 maandenafgelopen jaar
-
Mappen om te laten zienAlleAlleen 1e klasse mappen
@@ -706,7 +706,6 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Knipper LEDKnipper LED wanneer mail binnenkomt
-
Server instellingenBericht samenstelling opties
@@ -736,7 +735,7 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
(Optioneel)Jou naam(Optioneel)
- Email adres
+ E-mailadres(Vereist)Reply-naar adres(Optioneel)
@@ -754,10 +753,9 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Kies account/identiteitVerzenden als
-
Ga naar Account Instellingen -> Beheer identiteiten om identiteiten aan te makenJe kan je eigen identiteit niet verwijderen
- Je kan een identiteit niet gebruiken zonder email adres
+ Je kan een identiteit niet gebruiken zonder e-mailadresJe identiteit en handtekening wijzigingen worden niet opgeslagen als conceptOudste berichten eerst
@@ -793,8 +791,11 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Alleen sommige \"Plus\" accounts staan POP access
toe om verbinding te krijgen met dit programma. Als het niet mogelijk is om in te loggen met de juiste gebruikersnaam en wachtwoord, heb je misschien geen betaalde \"Plus\" account. Start de webbrowser om de toegang tot deze e-mailaccount te krijgen.
-
Als je POP3 wilt gebruiken, moet je het geebruik van POP3 activeren op de Yahoo mail settings pagina.
+
+
+
+
Onbekend CertificaatAccepteer Sleutel
@@ -823,8 +824,6 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Laat 1e en 2e klasse mappen zienLaat alles zien behalve 2e klasse mappen
-
-
Positie handtekeningVoor gequote berichtenNa gequote berichten
@@ -847,8 +846,6 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Apparaat zoomGebruik zoom widgets of pinch-zoom als het apparaat dat ondersteunt
-
-
Volgens systeemAchtergrond sync
@@ -1023,7 +1020,21 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
Niet verwijderenBevestig verplaatsing naar spam map
- Wil je dit bericht echt verplaatsen naar de spam map?
+
+ Wil je dit bericht echt verplaatsen naar de spam map?
+ Wil je dit bericht echt verplaatsen naar de spam map?
+
+ JaNee
@@ -1035,9 +1046,55 @@ Welkom bij K-9 Mail setup. K-9 is een open source mail cliënt voor Android, ge
›Kan geen verbinding maken.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Account \"%s\" is niet beschikbaar; controleer opslagSla bijlagen op naar...Sla bijlage opGeen bestandsverkenner gevonden. Waar wil je deze bijlage opslaan?
+
+
+
+
+
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 6cd8251f9..204fd5c57 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -19,9 +19,7 @@
Autorzy: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesHistoria zmian: %s
- http://code.google.com/p/k9mail/
@@ -98,8 +96,6 @@
Usuń kontoAnuluj oczekujące zadania (niebezpieczne!)
-
-
Konta◀◀
@@ -125,6 +121,9 @@
Pokaż/Ukryj szczegółyDodaj DW/UDWEdytuj temat
+
+
+
Dodaj załącznikDodaj załącznik (Zdjęcie)Add załącznik (Film)
@@ -280,8 +279,7 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Żaden adres email nie został znaleziony.Niektóre załączniki nie zostały pobrane. Zostaną pobrane automatycznie przed wysłaniem tej wiadomości.Niektóre załączniki nie mogą byc przesłane dalej ponieważ nie zostały wcześniej pobrane.
-
-
+
Od: %s <%s>Do:
@@ -301,7 +299,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Pobieram załącznik...Nie moge znaleźć programu do wyświetlenia pliku %s.
-
Pobierz całą wiadomość
@@ -328,7 +325,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
%swersja %s
-
Oznaczaj gwiazdkamiGwiazka wskazuje oznakowane wiadomościZaznaczanie wielu maili
@@ -348,6 +344,8 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Użyj czcionki o stałej szerokości do wyświetlania maili tekstowychSkasuj i wróć do listyWraca do listy wiadomości po usunięciu danego maila
+
+
Potwierdź akcjePokaż okno dialogowe kiedy wykonujesz wybrane akcje
@@ -360,13 +358,11 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Powiadomienia ekranowe przy zablokowanym ekranieNie pokazuj tematu wiadomości w pasku powiadimień gdy ekran jest zablokowany
-
Okres ciszyWyłącz dzwonienie, wibracje i mruganie w nocyPoczątek okresu ciszyKoniec okresu ciszy
-
Dodaj kontoWpisz dane konta(Możesz utworzyć %d dodatkowych kont.)
@@ -438,8 +434,8 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Podczas każdego pobraniaTylko ręcznie
+
Prefiks ścieżki IMAP
- (K-9 użyje NAMESPACE, jeśli funkcjonalność jest dostępna)SzkiceWysłane
@@ -530,7 +526,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
1000 wiadomościWszystkie wiadomości
-
Nie mogę skopiować ani przenieść wiadomości, która nie jest zsynchronizowana z serweremWystąpił błąd
@@ -574,6 +569,9 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Tworzenie wiadomości
+
+
+
Odpowiadaj po cytowanym tekściePodczas odpowiadania, wiadomość oryginalna pojawi się nad Twoją odpowiedzią.
@@ -581,6 +579,9 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Czysty tekst (bez obrazków i formatowania)HTML (z obrazkami i formatowaniem)
+
+
+
Styl cytowania podczas odpowiedziPrefix (jak Gmail, Pine)Nagłówek (jak Outlook, Yahoo!, Hotmail)
@@ -604,7 +605,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Przechowanie
-
Kolor kontaWybierz kolor, który będzie użyty przy wyświetlaniu folderów i listy kont
@@ -626,6 +626,8 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
512Kb1Mb2Mb
+ 5Mb
+ 10Mbdowolny rozmiar (bez limitu)Synchronizuj nowsze niż
@@ -642,7 +644,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
ostatnie 6 miesięcyostatni rok
-
Wyświetlaj folderyWszystkieTylko foldery klasy 1
@@ -717,7 +718,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Mrugaj diodąZamrugaj diodą przy nowej wiadomości
-
Ustawienia serweraOpcje tworzenia wiadomości
@@ -765,7 +765,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Wybierz konto/tożsamośćWyślij jako
-
Przejdź do "Ustawienia Konta" -> "Tożsamości" aby utworzyć tożsamośćNie możesz usunąć jedynej tożsamościNie możesz użyć tożsamości bez podanego adresu email
@@ -807,8 +806,11 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
do swojego konta z użyciem poprawnego hasła i adresu email, najprawdopodobniej
nie masz płatnego konta typu \"Plus\". W takim przypadku musisz z poczty
korzystać w dotychczasowy sposób, za pośrednictwem przeglądarki.
-
Jeśli chcesz uzywać POP3 dla tego dostawcy, powinieneś zezwolić na użycie POP3 na stronie ustawień poczty Yahoo.
+
+
+
+
Nieznany certyfikatAkceptuj
@@ -837,8 +839,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Klasy 1 oraz 2Wszystkie poza klasą 2
-
-
Umieść sygnaturęPrzed cytowaną wiadomościąPod cytowaną wiadomością
@@ -861,8 +861,6 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Systemowe powiększenieUżyj zoom widgets i pinch-zoom jeśli Twoje urzędzenie je obsługuje
-
-
Domyślny systemowySynchronizacja w tle
@@ -1035,7 +1033,21 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
Nie usuwajPotwierdź przeniesienie do spamu
- Na pewno przenieśc do spamu?
+
+ Na pewno przenieśc do spamu?
+ Na pewno przenieśc do spamu?
+
+ TakNie
@@ -1047,9 +1059,55 @@ Witaj w K-9 Mail, darmowym programie pocztowym dla systemu Android. Najistotniej
›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Konto \"%s\" jest niedostępne; sprawdź pamięc
+
+
+
+
+
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index f14f57657..7af2f917a 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -6,9 +6,7 @@
Autores: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesRevisões e informações: %s
- http://code.google.com/p/k9mail/
@@ -42,7 +40,7 @@
\u0020%s/%s\u0020(Nova verif. às @ %s)
-
+ \u0020(Sincronização desabilitada)Próximo
@@ -75,7 +73,7 @@
Marcar todas as como lidasIncluir contaEscrever
- Peaquisar
+ PesquisarResultado da pesquisaConfiguraçõesAbrir
@@ -85,8 +83,6 @@
Remover contaLimpar ações pendentes (perigoso!)
-
-
Contas◀◀
@@ -112,6 +108,9 @@
Ver/esconder detalhesIncluir Cc/BccEditar assunto
+ Confirmação de leitura
+ Confirmação de leitura será requisitada
+ Confirmação de leitura não será requisitadaIncluir anexoIncluir anexo (Imagem)Incluir anexo (Video)
@@ -128,7 +127,7 @@
Opções de pasta(Sem assunto)
-
+ Sem dataSem remetenteVerificando(Verificar %s%s)
@@ -202,7 +201,7 @@
Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código aberto para Android e é originalmente baseado no cliente de e-mail padrão do Android.
\n
-\n\nK-9\'s recursor aprimorados incluídos:
+\n\nK-9\'s recursos aprimorados incluídos:
\n * Puxar e-mail usando IMAP IDLE
\n * Melhor performance
\n * Reclassificação de mensagens
@@ -254,20 +253,19 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
BccAssuntoTexto da mensagem
-
-
-
-
-
-
+ ........ Mensagem Original ........
+ Assunto:
+ Enviado:
+ De:
+ Para:
+ Cc:%s escreveu:\n\nTexto citadoVocê deve incluir ao menos um destinatário.
-
+ Não foi possível encontrar o endereço de e-mail.Alguns anexos não foram incluídos. Eles poderão ser incluídos automaticamente antes desta mensagem ser enviada.Alguns anexos não podem ser encaminhados porque não foram inclusos na mensagem.
-
-
+ Mensagem citadaDe: %s <%s>Para:
@@ -283,11 +281,10 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Anexo salvo no cartão de memória como %s.Impossível salvar anexo no cartão de memória.Selecione \"Mostrar imagens\" para mostrar imagens incorporadas.
- Mostar imagens
+ Mostrar imagensBuscando anexo.Não foi possível encontrar um visualizador para %s.
-
Transferir mensagem completa
@@ -314,7 +311,6 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Sobre %sVersão: %s
-
Mostrar favoritosEstrelas indicam mensagens favoritasCaixas de multi-seleção
@@ -322,8 +318,8 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Visualizar mensagensItens mais espaçosos da lista com vizualizaçãoLinhas de visualização
-
-
+ Mostrar nomes correspondentes
+ Mostrar nomes correspondentes ao invés de seus e-mails.Mostar nomes dos contatosQuando disponível, utilizar nomes dos contatos para destinitárioColorir contatos
@@ -334,25 +330,25 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Use um tamanho fixo de fonte quando mostrar mensagens com texto simplesRetornar para lista após exclusãoRetornar para lista de mensagem após exclusão de mensagens
+ Mostrar próxima mensagem após exclusão
+ Mostrar próxima mensagem por padrão após exclusão de mensagensConfirmar açõesMostrar diálogo sempre quando for disparada uma açãoArquivoExcluir (apenas visualização)Spam
-
+ Marcar todas como lidasEnviarNotificações de bloqueio de telaNão mostrar assunto da mensagem na barra de status do sistema quando estiver bloqueado
-
Período de silêncioDesabilitar sons, vibração e luz indicadora à noiteInício do período de silêncioFim do período de silêncio
-
Configurar uma nova contaInforme o endereço de e-mail da conta:(Você você pode incluir %d mais contas.)
@@ -424,8 +420,8 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Quando verificadoApenas manualmente
+ Autodetectar o namespace do IMAPPrefixo do diretório IMAP
- (Usar NAMESPACE automático se disponível)Pasta de rascunhosPasta de enviados
@@ -516,7 +512,6 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
1000 mensagensTodas as mensagens
-
Não é possível copiar ou mover uma mensagem que não foi sincronizada com o servidorA configuração não pode ser concluída
@@ -541,8 +536,8 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Mostar avisos para mensagens que eu envioAvisos abrem mensagens não lidasProcurar por mensagens não lidas quando o aviso for aberto
-
-
+ Mostrar contagem de não lidas
+ Mostrar o número de mensagens não lidas na barra de notificação.Navegação com botões de scrollNunca
@@ -560,16 +555,22 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Enviando e-mails
+ Citar a mensagem original ao responder
+ Ao responder mensagens, a mensagem original é colocada na sua resposta.
+
Resposta após texto da mensagemQuando respondendo mensagens, o texto original deverá aparecer acima da minha resposta.
-
-
-
+ Formato da Mensagem
+ Texto (imagens e formatação serão removidas)
+ HTML (imagens e formatação serão preservadas)
-
-
-
+ Confirmação de leitura
+ Sempre solicitar confirmação de leitura
+
+ Estilo de citação ao responder
+ Prefixo (como Gmail, Pine)
+ Cabeçalho (como Outlook, Yahoo!, Hotmail)Configurações geraisExibição
@@ -590,7 +591,6 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Armazenamento
-
Cor da contaEscolha uma cor para pastas e listas desta conta
@@ -612,6 +612,8 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
512Kb1Mb2Mb
+ 5Mb
+ 10MbQualquer tamanho (sem limites)Sincronização de mensagens
@@ -628,7 +630,6 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Dos últimos 6 mêsesDo último ano
-
VisualizaçãoTodasSomente Pastas de Primeira Classe
@@ -703,7 +704,6 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Piscar LEDPiscar LED quando chegar e-mail
-
Configuração de servidorOpções para composição de uma mensagem
@@ -751,7 +751,6 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Escolher conta/identidadeEnviar como
-
Abra Configurações de Conta -> Gerenciamento de identidade para criar uma novaVocê não pode remover sua única identidadeVocê não pode usar uma identidade sem um endereço de e-mail
@@ -792,8 +791,11 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
permitindo que este programa se conecte. Se não estiver conseguindo logar nela com seu
endereço de e-mail e senha corretos, talvez você não tenha uma conta \"Plus\" paga.
Por favor, abra seu Web browser para conseguir acesso a estes tipos de contas.
-
Se desejar utilizar POP3 para este provedor, você deverá permitir o uso deste na página de configurações de se e-mail Yahoo.
+
+
+
+
Certificado desconhecidoAceitar chave
@@ -822,8 +824,6 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Mostrar pastas de Primeira e Segunda ClasseMostar todas exceto as de Segunda Classe
-
-
Local da AssinaturaAntes de escrever o textoDepois do texto escrito
@@ -846,8 +846,6 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Controle de zoom do sistemaHabilitar widgets de zoom se o telefone suportar
-
-
Padrões de sistemaSincronização em segundo plano
@@ -896,8 +894,8 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
GestosAceitar controle de gestos
-
-
+ Layout compacto
+ Ajusta o layout para mostrar mais em cada páginaTecla de volume para navegaçãoPercorrer itens usando controle de volume
@@ -916,8 +914,8 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Contador para resultados de pesquisaDesligar visualização rápida
-
-
+ Esconder contas especiais
+ Esconde a Caixa de Entrada Unificada e todas as contas de mensagens%s%s - Favorito
@@ -1020,7 +1018,20 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Não excluir
-
+
@@ -1032,9 +1043,55 @@ Bem-vindo à configuração do K-9 Mail. K-9 é um cliente de e-mail com código
Não é possível conectar.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index ced8e0123..d6089d4bf 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -3,61 +3,59 @@
K-9 MailK-9 Mail BETAGoogle, The K-9 Dog Walkers.
-
-
+ Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project.
+ Лицензия Apache License, Version 2.0.Авторы: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesИнформация об изменениях: %s
- http://code.google.com/p/k9mail/
-
-
+ Мы используем следующие тертьесторонние библиотеки: %s
+ Иконки настроения: %sчитать вложения электронной почтыРазрешать этой программе читать вложения электронной почты.
-
-
-
-
+ Читать письма
+ Разрешать этой программе читать ваши письма.
+ Унитожать письма
+ Разрешать этой программе уничтожать ваши письма.О программе %sАдресаДополнительные параметры%s
-
+ K-9 Mail Учётные записи%s:%sНаписать новое письмо
- Отлажки
- Выбрать Папку
-
+ Отладка
+ Выберите папку
+ Выберите цвет%s%s%s\u0020[%d]\u0020(Запрос %s:%s%s)
-
+ \u0020(Чтение заголовков %s:%s%s)\u0020(Отправка %s%s)\u0020(Обработка %s:%s%s)\u0020%s/%s\u0020(Следующий запрос @ %s)
-
+ \u0020(Синхронизация запрещена)Следующий
-
+ ПредыдущийОКОтменитьОтослать
-
+ Послать сноваВыбратьСброс выбораОтветитьОтветить всемУдалитьАрхивировать
-
+ СпамОчистить папкуПереслатьПереместить
@@ -81,13 +79,11 @@
ОткрытьПочтовые настройкиНастройки папки
-
+ Глобальные настройкиУдалить адрес
- Остановить незаконченные действия (опасность!)
+ Остановить незаконченные действия (опасно!)
-
-
- Список почтовых ящиков
+ Учётные записи◀◀Прочесть
@@ -97,14 +93,14 @@
Отметить все сообщения как прочитанныеОтметить все сообщения в \'%s\' как прочитанные? (включая
- сообщения в папке которые не отображаются в K-9)
+ сообщения в папке, которые не отображаются)
Добавить звездуУдалить звездуКопировать
-
-
-
+ Показать полный заголовок
+ Скрыть полный заголовок
+ Выбрать текстОтметить как непрочитанноеПереместить в
@@ -112,13 +108,16 @@
Показать/спрятать подробностиДобавить Копию/СКРедактировать тему
+
+
+
Добавить вложение
-
-
+ Добавить вложение (Изображение)
+ Добавить вложение (Видео)Сброс настроек
- Опустошить Мусор
+ Очистить КорзинуСтереть
-
+ Удалить локальные сообщенияВыбрать сортировкуОбратный порядок сортировкиО Программе
@@ -128,9 +127,9 @@
Параметры папок(Без темы)
-
+ Нет датыОтправитель отсуствует
- Запрос%s
+ Загрузка(Запрос %s%s)Загрузка сообщений\u2026Ошибка при соединении
@@ -140,24 +139,18 @@
Повторите загрузку сообщений
- Загрузить
- еще %d больше
+ Загрузить еще %dГБМБКББ
-
- Размер \"%s\" сократился от
- %s
- до
- %s
-
+ Размер \"%s\" сократился с %s до %sСжатие ящика \"%s\"Очистка ящика \"%s\"
-
+ Пересоздание учётной записи\"%s\"Новые сообщенияНовое сообщение от %s
@@ -176,37 +169,35 @@
ИсходящиеЧерновики
- Мусор
+ КорзинаОтправленные
-
-
+ Архив
+ Спам
- %s (Черновики)
- %s (Мусор)
- %s (Отправленные)
-
-
+ %s
+ %s
+ %s
+ %s
+ %sНе удалось отправить несколько сообщенийСмотрите папку %s для подробностей.
- Программа столкнулась с проблемой при отправке некоторых из Ваших сообщений.
- В связи с родом проблемы, программа не может быть уверена либо сообщения были разосланы.
- Адресаты, возможно, уже получили копию этих сообщений.
- \u000a\u000aСообщения, для которых такого рода проблема возникла были помечены звездой в папке "Исходящие".
+ Возникла проблема при отправке некоторых из Ваших сообщений, однако, возможно, они дошли до адресатов.
+ \u000a\u000aДанные сообщения помечены звездой в папке "Исходящие".
Если вы удалите звезды, программа попытается отправить сообщения еще раз.
- Нажмите на папку Исходящие и выберите "Отправить сообщения" для инициировки еще одной попытки отправки.\u000A\u000a
- Папка %s может содержать сообщения с ошибками о неудачах.
+ Нажмите на папку Исходящие и выберите "Отправить сообщения" для еще одной попытки отправки.\u000A\u000a
+ Папка %s может содержать сообщения о неудачах.
- K-9 предупреждение
+ K-9 Mail предупреждениеСинхронизация и передача прервана из-за отсутствия сети.Сообщений больше нету
-Добро пожаловать на K-9 Mail настройки. K-9 это программа электронной почты для Android операционных систем с открытым исходным кодом, первоначально основанная на стандартной программе Android Mail.
+Добро пожаловать на K-9 Mail настройки. K-9 Mail это программа электронной почты для Android операционных систем с открытым исходным кодом, первоначально основанная на стандартной программе Android Mail.
\n
-\n\n Улучшенные возможности программы K-9 включают:
+\n\n Улучшенные возможности программы K-9 Mail включают:
\n * Push mail при использовании IMAP IDLE
\n * Более высокая скорость
\n * Систематизация сообщений
@@ -218,7 +209,7 @@
\n * Сочетания клавиш на аппаратной клавиатуре
\n * Лучшая поддержка для IMAP
\n * Сохранение вложений на SD карту
-\n * Вычистка мусора
+\n * Очистка Корзины
\n * Сортировка сообщений
\n * ... и более
\n
@@ -227,14 +218,14 @@
\n Просьба представлять отчеты об ошибках, запросы про разработке новых функций, и задавать вопросы на http://k9mail.googlecode.com/Версия: %s
- Включить занос в журнал отладок
- Занос дополнительной диагностической информации
- Занос конфиденциальной информации
- Может показывать пароли в журналах.
+ Включить запись в журнал отладок
+ Запись дополнительной диагностической информации
+ Запись конфиденциальной информации
+ Разрешает запись паролей в журнал
- K-9 Mail for Android
+ K-9 Mail для Android
- Вся Почта
+ Вся почтаПоследние сообщения из всех почтовых ящиковВсе Входящие Сообщения
@@ -243,7 +234,7 @@
%s%s%s
- Загрузить болюше сообщений
+ Загрузить больше сообщенийДля:%sУдалитьОтметить как прочитанное
@@ -251,25 +242,24 @@
Добавить ЗвездуУдалить Звезду
- Для
+ КомуКопияСКТемаТекст сообщения-------- Исходное сообщение --------Тема:
-
+ Послано:От:Для:Копия:%s написал(а):\n\nЦитированный текстНеобходимо добавить хотя бы одного адресата.
-
+ Не найден адрес почты.Некоторые вложения не были загружены. Они будут автоматически загружены перед отправкой этого сообщения.Некоторые вложения не могут быть пересланы, поскольку они не загрузились.
-
-
+ Цитировать сообщениеОт: %s <%s>Для:
@@ -278,9 +268,9 @@
Сохранить\u25BC\u25B2
-
-
-
+ Архивировать
+ Перенести
+ СпамMMM dd yyyy hh:mm aВложение сохранено на карту SD под именем %s.Не удалось сохранить вложение на карту SD.
@@ -289,22 +279,21 @@
Загрузка вложения.Приложение просмотра не найдено для %s.
-
-
+ Загрузить сообщение целиком
-
-
-
+ Не все заголовки были загружены или сохранены. Выберите \"Сохранять заголовки локально\" в настройках входящего сервера, чтобы использовать эту возможность.
+ Все заголовки загружены, дополнительных заголовков для отображения нет.
+ Не удалось загрузить дополнительные заголовки из базы данных или почтового сервера.ПапкиНовая папкаИмя новой папки
- (Push)
+ (Поддержка Push Mail)
-
+ Еще от этого отправителяСообщение скопированоСообщение перенесено
@@ -316,44 +305,43 @@
О Программе %sВерсия: %s
-
- Начало сообщения
+ Показывать звездыЗвезды указывают отмеченные сообщенияФлажки множественного выбораВсегда показывать Флажки множественного выбораОтображение удобное для управления пальцами
-
-
-
-
-
-
-
-
-
+ Список сообщений с предпросмотром
+ Строки предпросмотра
+ Показывать имя отправителя
+ Показывать имя отправителя вместо e-mail, если это возмомжно
+ Показывать имя получателя
+ Использовать имя получателя из списка контактов
+ Раскраска контактов
+ Не раскрашивать имена в списке контактов
+ Раскрасить имена в списке контактов
-
-
-
-
+ Шрифты м ы иксированноц шириной
+ Использовать шрифт фиксированной ширины при показе плоского текста
+ Вернуться к списку после удаления
+ Вернуться к списку сообщений после удаления сообщения
+
+
-
-
-
-
-
-
-
+ Подтверждение действий
+ Показывать диалог при совершении действий
+ Архивировать
+ Удалить (только представление сообщения)
+ Спам
+ Пометить как прочитанное
+ Послать
-
-
-
-
-
-
-
-
+ Уведомления при заблокированном экране
+ Не показывать тему письма в уведомлениях, когда система заблокирована
+ Время тишины
+ Запретить сигнал, вибрацию, мигание в ночное время
+ Начинало времени тишины
+ Конец времени тишиныУстановить новый адресВведите адрес электронной почты:
@@ -369,15 +357,15 @@
Получение информации об адресе\u2026Проверка настроек входящего сервера\u2026Проверка настроек исходящего сервера\u2026
-
-
+ Аутентификация\u2026
+ Чтение настроек учётной записи\u2026Завершение\u2026Отмена\u2026Почти готово!Ваш ящик создан и почта на пути!Дать этому ящику имя (необязательно):
- Ваше имя (отображается на исходящих сообщениях):
+ Ваше имя (отображается в исходящих сообщениях):Ваш ящик готов!\n\nПочта загружается\u2026
@@ -413,29 +401,29 @@
Wi-FiДругие
-
-
+ Загрузить заголовки
+ Сохранить локально все заголовки
-
-
-
-
+ Внешнее хранилище (SD-карта)
+ Стандартное внутреннее хранилище
+ %1$s дополнительное внутреннее хранилище
+ Расположение хранилищаСтирать сообщенияСразу же после удаления или перемещенияВ ходе каждого запросаТолько вручную
+
Префикс пути IMAP
- (Автоматически использовать NAMESPACE если доступно)Имя папки ЧерновиковИмя папки Отправленныx
- Имя папки Мусора
-
-
+ Имя папки Корзины
+ Имя папки Архива
+ Имя папки Спам
-
+ Показывать только папки из подпискиАвтоматически открывать папкуПуть для WebDAV (Exchange)
@@ -472,7 +460,7 @@
Сжать данныеОчистить все данные (опасно!)
-
+ Пересоздать данные (крайний случай!)Частота опроса папок
@@ -489,19 +477,19 @@
Каждых 12 часовКаждых 24 часа
-
+ Запрашивать при соединении с Push MailИспользовать Push MailЕсли ваш сервер поддерживает такую возможность, новые сообщения появляются мгновенно. Эта опция может существенно улучшить или ухудшить скорость и эффективность всей системы.
-
-
-
-
-
-
-
-
-
-
+ Обновлять неактивное соединение
+ Каждую минуту
+ Каждые 2 минут
+ Каждые 3 минут
+ Каждые 6 минут
+ Каждые 12 минут
+ Каждые 24 минут
+ Каждые 36 минут
+ Каждые 48 минут
+ Каждые 60 минутОтправлять сообщения с этого ящика по умолчаниюОповещать о прибытии новой почты
@@ -516,8 +504,7 @@
250 сообщений500 сообщений1000 сообщений
-
-
+ все сообщенияНе удалось скопировать или переместить сообщение, которое не было синхронизированно с сервером
@@ -528,7 +515,7 @@
Изменить данныеПродолжить
-
+ РасширенныеОбщие настройкиЯщик по умолчаниюЯщик по умолчанию
@@ -541,95 +528,101 @@
Показать комбинированную папку Входящих сообщенийУведомлять о посланных мною сообщенийУведомлять даже о сообщениях, отправленных из личной почты
-
-
-
-
+ Открыть непрочитанные сообщения
+ Искать непрочитанные сообщения, когда уведомление открыто
+ Показать количество непрочитанных
+ Показать количество непрочитанных в строке уведомлений.Прокрутка навигационных кнопокНикогдаКогда присутствует клавиатураВсегда
-
-
-
+ Разрешить кнопки переноса сообщений
+ Показывает кнопки: Архив, Переместить, Спам.
+ Спрятать кнопки перемещения
-
-
-
-
+ Показывать изображения
+ Никогда
+ От контактов
+ От всехНаписание сообщений
-
-
+ Цитировать оригинальное сообщение при ответе
+ Оригинальное сообщение вставляется в ответное сообщение.
-
-
-
+ Отвечать после цитаты
+ При ответе цитата будет выше ответа.
-
-
-
+ Формат сообщения
+ Плоский текст (изображения и форматирование не сохраняется)
+ HTML (сохранять изображения и форматирование)
-
-
+
+
+
+ Стиль цитирования
+ Префикс (например Gmail, Pine)
+ Заголовок (например Outlook, Yahoo!, Hotmail)
+
+ Общие
+ ЭкранСинхронизация папокПапкиСписок сообщенийПросмотр сообщений
-
-
-
-
-
-
-
+ Префикс цитирования
+ Криптография
+ OpenPGP
+ Нет
+ Не доступна
+ Автоподпись
+ Использовать e-mail учётной записи для формирования ключа подписи.Частота опроса папокЧастота опроса папок 2-го класса
-
+ Хранилище
+ Цвет учётной записи
+ Выберите цвет учётной записи, используемый в папке и списке учётных записей
-
-
-
-
-
+ Notification LED color
+ Выбрать цвет мигания для учётной записиКоличество показываемых сообщений
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Загружать сообщения до
+ 1Kb
+ 2Kb
+ 4Kb
+ 8Kb
+ 16Kb
+ 32Kb
+ 64Kb
+ 128Kb
+ 256Kb
+ 512Kb
+ 1Mb
+ 2Mb
+ 5Mb
+ 10Mb
+ любого размера без ограничений
+ Синхронизировать сообщения
+ без ограничения по давности
+ за сегодня
+ за 2 последних дня
+ за 3 последних дня
+ за последнюю неделю
+ за 2 последних недели
+ за 3 последних недели
+ за последний месяц
+ за 2 последних месяца
+ за 3 последних месяца
+ за 6 последних месяцев
+ за последний годВыбор показываемых папокВсе
@@ -657,8 +650,8 @@
Папки 1-го и 2-го классаВсе, кроме папок 2-го класса
-
-
+ Синхронизировать удаление на сервере
+ Удаляет удалённые на сервере сообщенияНастройки папок
@@ -693,18 +686,17 @@
Звонок при новых сообщенияхВибрацияВибрация при новых сообщениях
-
-
-
-
-
-
-
-
+ Паттерн вибрации
+ По умолчанию
+ паттерн 1
+ паттерн 2
+ паттерн 3
+ паттерн 4
+ паттерн 5
+ Повторять вибрациюВыбор мелодии
-
-
-
+ Мигать
+ Мигать если получены сообщенияНастройки сервера
@@ -737,40 +729,39 @@
(Необязательныо)Адрес электронной почты(Обязательный)
-
-
+ Отвечать на адрес
+ (Необязательно)Подпись
- (Необязательныо)
+ (Необязательно)Включить подписьПодписьДобавить подпись к каждому отправляемому сообщению
- -- \nОтправлено с мобильного телефона через К-9 Mail. Извините за краткость, пожалуйста.
+ -- \nОтправлено через К-9 Mail. Извините за краткость, пожалуйста.Первоначальная личностьВыбрать личностьВыбрать личность
-
-
-
+ Выбрать учётную запись/личность
+ Послать какДобавить личность можно в Настройке Ящиков -> Управление личностямиНельзя удалить единственную личность.Личность без адреса электронной почты не позволяется.Ваш выбор личности и изменения подписи не будут сохранены.
-
-
-
-
-
-
-
-
-
-
-
-
+ Сначала старые сообщения
+ Сначала новые сообщения
+ Отправитель по алфавиту
+ Отправитель по алфавиту в обратном порядке
+ Тема по алфавиту
+ Тема по алфавиту в обратном порядке
+ Сначала сообщения со звёздами
+ Сначала сообщения без звёзд
+ Сначала непрочитанные сообщения
+ Сначала прочитанные сообщения
+ Сначала сообщения с вложениями
+ Сначала сообщения без вложенийСортировка по...Дате
@@ -781,25 +772,27 @@
Вложениям%s
- Удалить
- Почтовой ящик \"%s\" будет удален.
+ Удалить учётную запись
+ Учётная запись \"%s\" будет удален.
-
-
+ Пересоздать учётную запись
+ Все данные учётной записи \"%s\" будут уничтожены, но настройки сохранятся.
-
-
+ Очистить учётную запись
+ Все сообщения учётной записи \"%s\" будут уничтожены, но настройки сохранятся.
- Только избранные \"Plus\" ящики поддерживают получения электронной почты через \"POP"
- и таким образом работают с этой программой. Если вы не можете подключится
- с верными данными, то ваш тип почтового ящика не имеет такого доступа.
- Пожалуйста, пользуйтесь мобильной версией Yahoo! Mail для получения сообщений.
-
-
+ Только некоторые \"Plus\" ящики поддерживают получение почты через \"POP\". Если вы не можете подключится
+ с верными данными подключения, то ваш почтовый ящик не имеет такого доступа.
+ Воспользуйтесь мобильной версией Yahoo! Mail для получения сообщений.
+ Если вы хотите использовать POP3 для данного поставщика, вы должны разрешить использование POP3 на странице настроек почты Yahoo.
+ Если вы хотите использовать IMAP или POP3 для данного поставщика, вы должны разрешить использование IMAP или POP3 на странице настроек почты Naver.
+ Если вы хотите использовать IMAP или POP3 для данного поставщика, вы должны разрешить использование IMAP или POP3 на странице настроек почты Hanmail(Daum).
+ Если вы хотите использовать IMAP или POP3 для данного поставщика, вы должны разрешить использование IMAP или POP3 на странице настроек почты Paran.
+ Если вы хотите использовать IMAP или POP3 для данного поставщика, вы должны разрешить использование IMAP или POP3 на странице настроек почты Nate.Сертификат не признан
- Принять Ключ
- Отклонить Ключ
+ Принять сертификат
+ Отклонить сертификатDel (или D) - Удалить\u000AR -
Ответить\u000AA - Ответить Всем\u000AF - Переслать\u000AJ or P - Предыдущее
@@ -824,44 +817,47 @@
Показывать папки 1-го и 2-го классовПоказывать все папки, за исключением 2-го класса
-
-
- Пизиция подписи
- Перед цитатой
+ Размещение подписи
+ перед цитатойпосле цитатыТемноеСветлое
- Глобальные настройки
-
+ Экран
+ ГлобальныеОтладка
-
-
-
-
- Списки Сообщений
-
+ Конфиденциальность
+ Сеть
+ Взаимодействие
+ Список учётных записей
+ Списки сообщений
+ СообщенияИзображение
-
+ Язык
-
-
-
-
+ Режим одной колонки
+ Форматировать HTML сообщения для маленького экрана
+ Системное управление зумом
+ Разрешить использование зума, если устройство его поддерживает
-
-
-
+ По умолчаниюСинхронизация в фоновом режимеНикогдаВсегда
- Когда \'Фоноввый режим\' включен
-
+ Когда \'Фоновый режим\' включен
+ Когда \'Фоновые данные\' & \'Автосинхронизация\' включеныНикаких сообщшний не выбранноФормат даты
-
+
+ SHORT
+ MEDIUM
+ dd-MMM-yyyy
+ yyyy-MM-ddГрупповые операцииУдалить выбранное
@@ -869,8 +865,8 @@
Пометить выбранное как не прочитанноеПометить выбранное звездамиУдалить звезды с выбранных
-
-
+ Переместить выбранные в Архив
+ Переместить выбранные в СпамПереместить выбранноеСкопировать выбранноеРежим звезд
@@ -893,40 +889,40 @@
ЖестыПринимать контроль жестами
-
-
+ Компактное размещение
+ Настроить размещение для отображения максимума на каждой странице
-
-
-
-
+ Использовать управление громкостью для навигации
+ Перемещаться по элементам, используя управление громкостью
+ Сообщение
+ Различные списки элементов
-
-
+ Использовать кнопку \"Назад\"
+ \"Назад\" всегда возвращает на уровень вверх
-
-
+ Входить в общий ящик при запуске
+ Показать общий ящик сообщений после запуска
-
-
+ Показать размер учётной записи
+ Выключите для быстрого отображения
-
-
+ Считать результаты поиска
+ Выключите для быстрого отображения
-
-
+ Спрятать специальные учётные записи
+ Спрятать объединённый ящик со входящими письмами и все учётные записи сообщений
-
-
-
+ %s%s
+ - Помеченные
+ - Непрочитанные
-
-
+ Все сообщения
+ Все сообщения в папках для поикаОбъединенная папка входящей почты (непрочитанное)Все непрочитанные сообщения в объединенных папках
-
+ Нажмите конверт или звездочку для непрочитанных или помеченных звездой сообщенийОбъединитьПоказывать непрочитанные сообщения в объединенной папке
@@ -939,99 +935,159 @@
Дистанционное управление K-9 MailПозволяет этому приложению управлеть деятельностью и настройками K-9 Mail.
-
-
+ Размер шрифта
+ Настройте размер шрифта
-
-
-
+ Список учётных записей
+ Название учётной записи
+ Описание учётной записи
-
-
-
+ Список папок
+ Имя папки
+ Статус папки
-
-
-
-
-
+ Список сообщений
+ Тема
+ Отпрвитель
+ Дата
+ Предпросмотр
-
-
-
-
-
-
-
-
-
+ Сообщения
+ отправитель
+ Кому
+ Скрытая копия
+ дополнительные заголовки
+ Тема
+ Время
+ Дата
+ Тело сообщения
-
-
-
-
-
-
-
+ самый крочшечный
+ Крошечный
+ Еще меньше
+ Маленький
+ средний
+ Большой
+ Наибольший
-
-
-
-
-
+ Крошечный
+ Маленький
+ Нормальный
+ Большой
+ Наибольший
-
+ Выберите \"Настройка\" -> \"Использовать обход проблемы...\", чтобы вкладывать картинки и изображения используя Gallery 3D.
-
+ Выберите \"Добавить вложение (Картинка)\" или "Добвить вложение (Видео)\", чтобы вкладывать картинки и изображения используя Gallery 3D.
-
-
-
+ Разное
+ Использовать обход проблемы с \"Использовать галерею\"
+ Показывать кнопки для добавления картинок и видео вложений (чтобы обойти проблемы с 3D в Gallery)
-
-
-
-
-
-
-
-
-
-
-
-
+ Нет подходящего приложения для действия.
+ Установленная версия APG не поддерживается.
+ подписать
+ Зашифровать
+ Расшифровать
+ проверить
+ <неизвестный>
+ id: %s
+ K-9 Mail не имеет разрешения для полного доступа к APG, please пожалуйста переустановите приложение.
+ PGP/MIME сообщения пока не поддерживаются.
+ Предупреждение: вложения еще не подписаны и не зашифрованы.
+ Отправка отменена.
-
-
+ Сохранить черновик сообщения?
+ Сохранить или уничтожить сообщение?
-
+ Это сообщение не может быть отображено, так как кодовая страница \"%s\" не найдена.
-
+ Выберите текс для копирования.
-
-
-
-
+ Подтвердите удаление
+ Вы хотите удалить это сообщение?
+ Удалить
+ Не удалять
-
-
-
-
+ Подтвердите перенос в папку Спам
+
+ Вы действительно хотите переместить сообщение в папку Спам?
+ Вы действительно хотите переместить %1$d сообщений в папку Спам?
+
+ Please review how to handle pluralization for your language at (1) and ajust
+ the elements accordingly
-
+ Possible values for 'quantity': zero, one, two, few, many, other
-
-
-
+ (1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-
+-->
+
+ Да
+ Нет
+
+ Скачивание вложения
+
+ Разрешить журналирование отладочной информайии
+
+ »
+ ›
+ Не получается соединиться.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Учётная запись\"%s\" недоступна; проверьте хранилище
+
+ Сохранять вложения в...
+ Сохранить вложение
+ Не найден браузер файлов. Где бы вы хотели сохранить вложение?
+
+
+
+
-
-
-
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index afbcbd5d4..f33a11d6a 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -6,9 +6,7 @@
Copyright 2008-%s The K-9 Dog Walkers. Vissa delar Copyright 2006-%s the Android Open Source Project.Licensierat under Apache-licensen, version 2.0.Upphovsmän: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesRevisionsinformation: %s
- http://code.google.com/p/k9mail/Vi använder följande tredjepartsbibliotek: %sEmoji-ikoner: %s
@@ -85,8 +83,6 @@
Ta bort kontoRensa avvaktande handlingar (farligt!)
-
-
Konton◀◀
@@ -112,6 +108,9 @@
Visa/dölj detaljerLägg till Cc/BccRedigera ämne
+
+
+
Lägg till bilagaLägg till bilaga (Bild)Lägg till bilaga (Video)
@@ -270,8 +269,7 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Några bilagor hämtades inte. De kommer att hämtas automatiskt innan detta brev sänds.Några bilagor kan inte vidarebefordras eftersom de inte har hämtats.
-
-
+
Från: %s <%s>Till:
@@ -291,7 +289,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Hämtar bilaga.Kan inte hitta visare för %s.
-
Hämta hem hela brevet
@@ -318,7 +315,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Om %sVersion: %s
-
StjärnorStjärnor indikerar flaggade brevCheckboxar för flerval
@@ -338,6 +334,8 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Använd ett teckensnitt med fast bredd för att visa brev med enbart textÅtervänd till listan efter raderingÅtervänd till listan efter att ha raderat ett brev
+
+
Bekräfta åtgärderVisa en dialogruta när du genomför utvalda åtgärder
@@ -350,13 +348,11 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
PrivatlägeVisa inte e-postens ämnen i notifieringsytan när systemet är låst
-
Tyst tidAvaktivera ringsignaler, vibration och blinkande på nattenTyst tid börjarTyst tid slutar
-
Konfigurera ett nytt kontoAnge detta kontos e-post-adress:(Du kan lägga till ytterligare%d konton.)
@@ -428,8 +424,8 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Vid varje e-post-kontrollEndast manuellt
+
Sökvägsprefix för IMAP
- (Automatiskt, använder NAMESPACE om tillgängligt)Namn på utkastmappNamn på skickatmapp
@@ -520,7 +516,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
1000 brevalla brev
-
Kan inte kopiera eller flytta ett brev som inte är synkroniserat med servernKunde inte fullborda konfigurationen
@@ -564,6 +559,9 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Skriva brev
+
+
+
Svar efter citatVid svar på e-post placeras originalmeddelandet ovanför ditt svar.
@@ -571,6 +569,9 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Ren text (bilder och formatering tas bort)HTML (bilder och formatering behålls)
+
+
+
Citationsstil vid svarPrefix (som Gmail, Pine)Header (som Outlook, Yahoo!, Hotmail)
@@ -594,7 +595,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Lagring
-
KontofärgVälj färg för att visa detta konto i mappar och kontolistor
@@ -616,6 +616,8 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
512Kb1Mb2Mb
+ 5Mb
+ 10MbIngen gränsSynka e-post från
@@ -632,7 +634,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
senaste 6 månadernasenaste året
-
Mappar att visaAllaBara första klassens mappar
@@ -707,7 +708,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Blinka LEDBlinka LED när det kommer ny e-post
-
ServerinställningarInställningar för att skriva brev
@@ -755,7 +755,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Välj konto/identitetSkicka som
-
Gå till Kontoinställningar -> Hantera identiteter för att skapa en identitetDu kan inte radera din enda identitetDu kan inte använda en identitet utan e-postadress
@@ -796,8 +795,11 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
vilket krävs för detta program för att ansluta. Om du misslyckas med att logga in
med din korrekta adress och lösenord så kanske du inte har ett betalt
\"Plus\"-konto. Vänligen starta webbläsaren för att komma åt dessa konton.
-
Om du vill använda POP3 med denna leverantör måste du välja att tillåta POP3 på inställningssidan för Yahoo!.
+
+
+
+
Okänt CertifikatAcceptera nyckel
@@ -826,8 +828,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Visa första och andra klassens mapparVisa alla förutom andra klassens mappar
-
-
SignaturpositionFöre citerad textEfter citerad text
@@ -850,8 +850,6 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Kontroll av zoomAktivera zoom-widgets eller nyp-zoom om din enhet stödjer det
-
-
SystemstandardBakgrundssynkronisering
@@ -1026,7 +1024,20 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
Radera inte
-
+
@@ -1038,9 +1049,55 @@ Välkommen till installationen av K-9 E-post. K-9 är en e-postklient med öppen
›Kan inte ansluta.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
new file mode 100644
index 000000000..e18585d0c
--- /dev/null
+++ b/res/values-tr/strings.xml
@@ -0,0 +1,1074 @@
+
+
+ K-9 Posta
+ K-9 Mail BETA
+ Yazarlar: %s
+ Revizyon Bilgileri: %s
+ K-9 posta kaynak kodları içerir: %s
+
+ Eposta eklerini oku
+ Bu uygulamaya Eposta eklerinizi okumasına izin ver.
+ Epostaları oku
+ Bu uygulamaya Epostalarınızı okumaya izin ver.
+ Epostaları sil
+ Bu uygulamaya Epostalarınızı silmeye izin ver.
+
+ Hakkında %s
+ Hesaplar
+ Gelişmiş
+ %s
+ K-9 Hesaplar
+
+ %s:%s
+
+ Oluştur
+ Onar
+ Klasör Seç
+ Bir renk Seç
+
+ %s%s%s
+
+ \u0020[%d]
+ \u0020(Poll %s%s%s)
+ \u0020(Fetching headers %s:%s%s)
+ \u0020(Sending %s%s)
+ \u0020(Proc %s%s%s)
+ \u0020%s/%s
+
+ \u0020(Next poll @ %s)
+ \u0020(Sync disabled)
+
+
+ İleri
+ Geri
+ Tamam
+ İptal
+ Gönder
+ Tekrar Gönder
+ Seç
+ Kaldır
+ Cevap
+ Hepsini Cevapla
+ Sil
+ Arşiv
+ Spam
+ Klasörü temizle
+ İlet
+ Taşı
+ Devam
+ Tamam
+ Kaldır
+ Çıkart
+ Taslak olarak Kaydet
+ Yeniden dene
+ Yinele
+ Epostayı Kontrol et
+ Mesajları Gönder
+ Klasör Listesi
+ Klasörleri Yinele
+ Hepsini Okundu olarak işaretle
+ Hesap Ekle
+ Oluştur
+ Arama
+ Arama Sonuçları
+ Ayarlar
+ Açık
+ Hesap Ayarları
+ Klasör Ayarları
+ Genel Ayarlar
+ Hesabı Kaldır
+ Bekleyen faaliyetleri Temizle (Tehlike!)
+
+ Hesaplar
+ ◀
+ ◀
+ Oku
+ Okundu olarak işaretle
+ Paylaş
+ Gönderici Seç
+
+ Hepsini okundu olarak işaretle
+ içindeki bütün mesajları \'%s\' okundu olarak işaretle? (Klasöre
+ eklenen mesajlar K-9 de gösterilemez.)
+
+ Yıldız Ekle
+ Yıldızı Kaldır
+ Kopyala
+ Tam Başlığı Göster
+ Tam Başlığı Sakla
+ Metin Seç
+
+ Okunmadı Olarak İşaretle
+ Taşı
+ Klasörler
+ Ayrıntıları Göster/Sakla
+ Ekle Cc/Bcc
+ Konuyu Düzenle
+ Alındıyı Oku
+ Okudu alındısı istenecek
+ Okudu alındısı istenmeyecek
+ Ekle
+ Ekle (İmaj)
+ Ekle (Video)
+ Çöp Ayarları
+ Çöpü Boşalt
+ Silmek
+ Yerel mesajları temizle
+ Sıralamayı Seç
+ Sıralamayı tersine çevir
+ Hakkında
+
+ Ayarlar
+ Hesap Seçenekleri
+ Klasör Seçenekleri
+
+ (Konu yok)
+ Tarih yok
+ Gönderen yok
+ Seçim
+ (Poll %s%s)
+ Yüklenen mesajlar\u2026
+ Bağlantı hatası
+ Mesaj bulunamadı
+ Hata
+ Gönderiliyor
+
+ Birden fazla mesaj yüklemeyi deniyor
+
+ Boyuta kadar yükle
+ %d daha fazla
+
+ GB
+ MB
+ KB
+ B
+
+
+ Hesap \"%s\" den küçüldü
+ %s
+ to
+ %s
+
+
+ Hesap sıkıştırma \"%s\"
+ Hesap temizleme \"%s\"
+ Hesap yenileme \"%s\"
+
+ Yeni posta
+ den yeni posta %s
+ %d Okunmadı (%s)
+ %d Yeni mesajlar (%s)
+ in %d hesaplar
+ Mesaj gönderilemedi
+
+ Posta kontrol ediliyor: %s:%s
+ Posta kontrol ediliyor
+ Posta gönderiliyor: %s
+ Posta gönderiliyor
+ :
+
+ Gelen Kutusu
+ Giden Kutusu
+
+ Taslaklar
+ Çöp
+ Gönderilen
+ Arşiv
+ Spam
+
+
+ %s (Taslaklar)
+ %s (Çöp)
+ %s (Gönder)
+ %s (Arşiv)
+ %s (Spam)
+
+ Bazı mesajların gönderilmesi başarısız
+ Bakın %s klasörüne detaylar için.
+ K-9 mesajlarınızın bir kısmını gönderirken bir sorunla karşılaştı.
+ Ancak, sorunun yapısına uygun olarak, K-9 mesajların gidip gitmediğinden emin olamamakta,
+ Alıcılar çoktan mesajın kopyalarını almış da olabilir.
+ \u000a\u000a Mesajlar bu tip sorunlar çıkarttığı için Giden kutusunda şimdi yıldızla işaretlendi.
+ Yıldızları kaldırırsanız, K-9 mesajları tekrar göndermeyi dener.
+ Giden kutusuna uzun basın \"Giden mesajlar\" eylemini sırayla diğer gönderme girişimlerini başlatmayı bulmak için.\u000A\u000a
+ %s klasör başarısızlıklarla ilgili hata mesajları içerebilir.
+
+ K-9 uyarı
+ Ağın olmaması yüzünden Eşleştirme ve Gönderme durduruldu.
+
+ Daha fazla mesaj yok
+
+ K-9 Posta\'ya Hoşgeldiniz!\n K-9 Android için bir gelişmiş eposta alıcısıdır ki birçok gelişmiş posta sunucusu özelliklerini destekler. Her ağ merkezli iletişim uygulaması gibi, K-9\'i ağ bant genişliğinin bir büyük kısmını kullanmaya yapılandırmak mümkündür. Eğer sınırsız bir data paketiniz yoksa veya uluslararası dolaşıma niyetleniyorsanız, lütfen bant genişliğinizin kullanımına dikkat edin. Bu uygulama olduğu gibi sağlanır, her türlü garanti kapsamı dışında. Bu uygulamanın ne yazar ne de dağıtıcısı herhangi bir davranıştan, kullanımdan, terbiyesizlik veya bu uygulamanın kötüye kullanımından sorumlu tutulamaz. Tüm bunlar söylenildi, biz K-9\'in iyi çalışacağına çok inanıyoruz ve biz sizin onunla bulacağınız hakkındaki her problemi duymak istiyoruz. Lütfen eposta atın support@kaitenmail.com Eğer sorun yaşıyorsanız, doğru şeyler yapmak için elimizden gelenin en iyisini yapacağız.
+
+ Version: %s
+ Onarma günlüğünü Etkinleştir
+ Extra tanı bilgisi günlüğü tut
+ Hassas bigi günlüğü tut
+ Günlüklerde şifreler görünebilir.
+
+ Android için K-9 Posta
+
+ Bütün Postalar
+ Bütün hesaplardan gelen yeni mesajlar
+ Gelen Kutusu bütün postaları
+
+ %s:%s
+ %s
+ %s
+ %s
+ %s
+ Daha fazla mesaj yükle
+ To:%s
+ Sil
+ Okundu olarak işaretle
+ Okunmadı olarak işaretle
+ Yıldız Ekle
+ Yıldızı Kaldır
+
+ Kime
+ Cc
+ Bcc
+ Konu
+ Mesaj Metni
+ -------- Orjinal Mesaj --------
+ Konu:
+ Gönder:
+ Kimden:
+ Alıcı:
+ Cc:
+ %s wrote:\n\n
+ Quoted text
+ En az bir Alıcı eklemelisiniz.
+ Eposta adresi bulunamadı.
+ Bazı ekler indirilemedi.Bu mesaj gitmeden önce onlar otomatik indirilecek.
+ Bazı ekler iletilemedi çünkü onlar indirilemedi.
+ Alıntı mesaj
+
+ Kimden: %s <%s>
+ Kime:
+ Cc:
+ Açık
+ Kaydet
+ \u25BC
+ \u25B2
+ Arşiv
+ Taşı
+ Spam
+ MMM dd yyyy hh:mm a
+ SD Karta Ek kaydedildi %s.
+ SD Karta Ek kaydedilemedi.
+ Seç \"Resimleri Göster\" gömülü resimleri göster.
+ Resimleri Göster
+ Çekici Ek.
+ için görüntüleyici bulunamadı. %s.
+
+ Bütün mesajı indir.
+
+
+ Bütün başlıklar indirilemedi veya kaydedilemedi. Seç \"Bütün başlıkları kaydet\" hesabın gelen sunucu ayarların içinde gelecek için bunu etkinleştirin.
+ Bütün başlıklar indirildi, fakat göstermeye ek başlıklar yok.
+ Veritabanından veya posta suncucundan ek başlıkların gerigetirilişi başarısız.
+
+ Klasörler
+ Yeni Klasör
+
+ Yeni Klasör İsmi
+
+ (Push)
+
+ Bu Göndericiden daha fazla mesaj
+
+ Mesaj kopyalandı
+ Message taşındı
+ Message silindi
+ Message çıkartıldı
+ Mesaj taslak olarak kaydedildi.
+ Mesaj silinemedi
+
+ Hakkında %s
+ Version: %s
+
+ Yıldızları Göster
+ Yıldızlar bayraklı mesajları gösterir.
+ Çoklu-seçim işaretkutuları
+ Çoklu-seçim işaretkutularını Daima göster.
+ Mesaj önizleme
+ Mesaj önizleme ile Roomier listesi ürünü.
+ Önizleme hatları
+ Mektuplaşanların isimlerini göster.
+ Mektuplaşanların eposta adresleri yerine isimlerini göster.
+ Rehberdeki kişi isimlerini göster.
+ Alıcı isimlerini mümkün olduğunda rehberdeki isimlerden kullan.
+ Bağlantıları reklendir
+ Rehberdeki kişilerin isimlerini renklendirme.
+ Rehberdeki kişilerin isimlerini renklendir.
+
+ Sabit genişlikli fontlar
+ Düz metin mesajları gösterdiğinde sabit genişlikli font kullan.
+ Sildikten sonra listeye dön.
+ Mesajı sildikten sonra mesaj listesine dön.
+
+
+
+ Eylemleri Onaylayın
+ Seçilmiş eylemleri yaptığınız zaman bir diyalog göster
+ Arşiv
+ Sil (message view only)
+ Spam
+ Hepsini okundu olarak işaretle
+ Gönder
+
+ Ekran-kilidi bildirimleri
+ Sistem kilitlendiğinde bilidirim çubuğunda mesaj konusunu gösterme
+
+ Sessiz Zaman
+ Çalma, gürültü ve geceleyin flaş devre dışı
+ Sessiz Zaman başlıyor
+ Sessiz Zaman bitiyor
+
+ Bir yeni hesap kurmak
+ Bu hesabın eposta adresine giriş:
+ (Ekleyebilirsiniz %d daha fazla hesap.)
+ Eposta adresi
+ %s geçerli bir eposta adresi değil.
+ %s çoktan eklendi.
+ Şifre
+ Postaları varsayılan olarak bu hesaptan gönder
+ El ile ayar
+
+
+ Hesap bilgisi alınıyor\u2026
+ Gelen sunucu ayarları kontrol ediliyor\u2026
+ Giden sunucu ayarları kontrol ediliyor\u2026
+ Kimlik Doğrulaması\u2026
+ Çekici hesap ayarları\u2026
+ Bitiyor\u2026
+ İptal ediliyor\u2026
+
+ Hemen hemen tamam!
+ Hesabınız kurulu,ve posta onun yolunda!
+ Bu hesaba bir isim verin (isteğe bağlı):
+ İsminizi yazın (Giden mesajlarda görüntülenir):
+
+ Hesabınız kurulu!\n\nFetching mail\u2026
+
+ Hesap tipi
+ Bu ne tür bir hesaptır?
+ POP3
+ IMAP
+ Exchange (WebDAV)
+
+ Gelen sunucu ayarları
+ Kullanıcı adı
+ Şifre
+ POP3 sunucu
+ IMAP sunucu
+ Exchange sunucu
+ Port
+ Güvenlik tipi
+ Kimlik doğrulama tipi
+ Hiçbiri
+ SSL (Varsa)
+ SSL (daima)
+ TLS (Varsa)
+ TLS (Daima)
+
+ Bir mesaj sildiğim zaman
+ Sunucudan silme
+ 7 gün sonra
+ Sunucudan sil
+ Sunucuda okundu olarak işaretle
+
+ Ağda sıkıştırma kullan:
+ Mobile
+ Wi-Fi
+ Other
+
+ Başlıkları indir
+ Bütün mesaj başlıklarını yerel kaydet
+
+ Harici depolama (SD card)
+ Düzenli dahili depolama
+ %1$s ek iç depolama
+ Depolama yeri
+
+ Silinen mesajları çıkart
+ Hemen
+ Seçim zamanı
+ Sadece elle
+
+
+ IMAP yolu öneki
+
+ Taslaklar klasörü
+ Giden Klasörü
+ Çöp Klasörü
+ Arşiv Klasörü
+ Spam Klasörü
+
+ Sadece abone olunan klasörleri göster
+ Otomatik genişleyen klasör
+
+ OWA path
+ İsteğe bağlı
+
+ Kimlik doğrulama yolu
+ İsteğe bağlı
+ Mailbox takma adı
+ İsteğe bağlı
+
+ Giden sunucu ayarları
+ SMTP sunucu
+ Port
+ Güvenlik Tipi
+ Hiçbiri
+ SSL
+ TLS (Varsa)
+ TLS (Daima)
+ Oturum açmayı gerektirir.
+ Kullanıcı Adı
+ Şifre
+ Kimlik Doğrulama Tipi
+
+ Kullanıcı Adı & şifre
+ Kullanıcı Adı
+ Şifre
+ POP before SMTP
+ IMAP before SMTP
+ WebDAV (Exchange) before SMTP
+
+ Geçersiz kurulum: %s
+
+ Hesap seçenekleri
+
+ Sıkıştırmak
+ Mesajları temizle (tehlike!)
+ Veriyi canlandır (Son çare!)
+
+ Klasör bilgi toplama sıklığı
+
+ Asla
+ Her Dakika
+ Her 5 dakikada
+ Her 10 dakikada
+ Her 15 dakikada
+ Her 30 dakikada
+ Her Saat
+ Her 2 saatte
+ Her 3 saatte
+ Her 6 saatte
+ Her 12 saatte
+ Her 24 saatte
+
+ Push için bağlandığında
+ Push maili bu hesap için etkinleştir.
+ Eğer sunucunuz onu destekliyorsa, yeni mesajlar anında belirecek. Bu seçenek dramatik olarak performansı arttırabilir veya zarar verebilir.
+ IDLE bağlantıyı Yenile
+ Her Dakika
+ Her 2 dakikada
+ Her 3 dakikada
+ Her 6 dakikada
+ Her 12 dakikada
+ Her 24 dakikada
+ Her 36 dakikada
+ Her 48 dakikada
+ Her 60 dakikada
+
+ Postayı varsayılan olarak bu hesaptan gönder.
+ Posta vardığında beni uyar.
+ Posta kontrol edilirken beni uyar.
+
+
+ Görüntülenecek Mesaj sayısı
+ 10 mesaj
+ 25 mesaj
+ 50 mesaj
+ 100 mesaj
+ 250 mesaj
+ 500 mesaj
+ 1000 mesaj
+ Bütün mesajlar
+
+ Sunucu ile eşleştirilmemiş bir mesaj kopyalanamaz veya taşınamaz.
+
+ Kurulum bitirilmedi
+ Kullanıcı Adı veya şifre doğru değil.\n(%s)
+ Sunucuya güvenli bağlantı kurulamadı.\n(%s)
+ Sunucuya bağlanılamadı.\n(%s)
+ Ayrıntıları düzenle
+ Devam
+
+ Gelişmiş
+ Hesap ayarları
+ Varsayılan hesap
+ Varsayılan hesap
+ Postayı varsayılan olarak bu hesaptan gönder
+ Yeni posta bildirimleri
+ Eşleştirme bildirimleri
+ Eposta adresiniz
+ Posta geldiğinde durum çubuğunda bildir
+ Posta kontrol edildiğinde durum çubuğunda bildir
+ Birleşik Gelen kutusunu göster
+ Giden postayı ekle
+ Gönderdiğim mesajlar için bir bildirim göster
+ Okunmamış mesaj bildirimi açık
+ Bildirim açık olduğunda okunmamış mesajlar için arama yap
+ Okunmamış sayısını göster
+ Bildirim çubuğunda okunmamış mesaj numarasını göster.
+
+ Gezinme tuşlarını kaydırma
+ Asla
+ Klavye olduğu zaman
+ Daima
+
+ İşaretleme düğmelerini etkinleştir
+ Arşiv, Taşıma ve Spam düğmelerini göster.
+ İşaretleme düğmelerini kaydır
+
+ Daima imajları göster
+ Hayır
+ Kişilerden
+ Herkesten
+
+ Posta gönderiliyor
+
+ Cevaplarken orjinal mesajı sakla
+ Mesajları cevaplarken, orjinal mesaj cevabınızın içinde.
+
+ Alıntı metinden sonra cevapla
+ Mesajları cevaplarken, orjinal mesaj cevabınızın üzerinde gözükecek.
+
+ Mesaj Biçimi
+ Düz Metin (imajlar ve biçimler kaldırılacak)
+ HTML (imajlar ve biçimler korunacak)
+
+ Alındı oku
+ Daima bir alındı okuma iste
+
+ Alıntı sitili
+ Önek (Gmail, Pine gibi)
+ Başlık (Outlook, Yahoo!, Hotmail gibi)
+
+ Genel Ayarlar
+ Görüntü
+ Posta alma
+ Klasörler
+ Mesajları listeleme
+ Mesajlara bakmak
+ Alınan metinden önek
+ Kriptografi
+ OpenPGP Sağlayıcı
+ Hiç
+ mevcut değil
+ Otomatik oturum açma
+ Hesapların eposta adreslerini imza anahtarı sanmayı kullan.
+
+ Klasör veri toplama sıklığı
+ 2ci sınıf kontrol etme sıklığı
+
+ Depolama
+
+ Hesap rengi
+ Klasör ve hesap listesinde kullanılan hesap rengini seç
+
+ Bildirim LED ışığı rengi
+ Cihazınızın LED ışığına renk seçin bu hesap için ışıldasın
+
+ Yerel klasör boyutu
+
+ Mesajları şu boyut üzerinden getir
+ 1Kb
+ 2Kb
+ 4Kb
+ 8Kb
+ 16Kb
+ 32Kb
+ 64Kb
+ 128Kb
+ 256Kb
+ 512Kb
+ 1Mb
+ 2Mb
+ 5Mb
+ 10Mb
+ Her boyutta (sınır yok)
+
+ Mesajları eşleştirme sıklığı
+ Her zaman (sınır yok)
+ Bugün
+ Son 2 gün
+ Son 3 gün
+ Son hafta
+ Son 2 hafta
+ Son 3 hafta
+ Son Ay
+ Son 2 ay
+ Son 3 ay
+ Son 6 ay
+ Geçen yıl
+
+ Görüntülenecek Klasörler
+ Hepsi
+ Sadece 1nci Sınıf klasörler
+ 1nci ve 2nci Sınıf klasörler
+ 2nci Sınıf klasörler dışında hepsi
+
+ Anket Klasörler
+ Hepsi
+ Sadece 1nci Sınıf klasörler
+ 1st and 2nd Class folders
+ 2nci Sınıf klasörler dışında hepsi
+ Hiçbiri
+
+ Push Klasörleri
+ Hepsi
+ Sadece 1nci Sınıf klasörler
+ 1nci ve 2nci Sınıf klasörler
+ 2nci Sınıf klasörler dışında hepsi
+ Hiçbiri
+
+ Taşıma/Kopyalama hedef klasörleri
+ Hepsi
+ Sadece 1nci Sınıf klasörler
+ 1nci ve 2nci Sınıfı klasörler
+ 2nci Sınıf klasörler dışında hepsi
+
+ Sekron sunucusu silme işlemleri
+ Mesajlar silindiğinde sunucudan kaldır
+
+ Klasör Ayarları
+
+ Zirve grupta göster
+ Klasör listesinin zirvesine yakın göster
+
+ Klasör Görüntüleme Sınıfı
+ Hiçbiri
+ 1nci Sınıf
+ 2nci Sınıf
+
+ Klasör Senkronize Sınıfı
+ Hiçbiri
+ 1nci Sınıf
+ 2nci Sınıf
+ Aynı görünüleme sınıfı
+
+ Klasör itme sınıfı
+ Hiçbiri
+ 1nci Sınıf
+ 2nci Sınıf
+ Aynı senkranizayon sınıfı
+
+ Gelen Sunucu
+ Gelen posta sunucusunu yapılandır
+ Giden sunucu
+ Giden posta (SMTP) sunucusunu yapılandır
+ Birbaşka hesap ekle
+ Hesap ismi
+ İsminiz
+ Bildirimler
+ Posta geldiğinde çal
+ Titre
+ Posta geldiğinde titre
+ Titreme modeli
+ Varsayılan
+ Model 1
+ Model 2
+ Model 3
+ Model 4
+ Model 5
+ Titreşimi tekrarla
+ Yeni posta zilsesi
+ LED Işığı
+ Posta geldiğinde LED ışıldasın
+
+ Sunucu Ayarları
+
+ Mesaj komposizyon seçenekleri
+ Kompozisyon varsayılanları
+ Sizin varsayılan Kimden, Bcc ve imzayı ayarlayın
+
+ Kimlikleri Yönetmek
+ \'Kimden\' adresler ve imzaların alternatiflerini ayarlayın
+
+ Kimlikleri Yönetmek
+
+ Kimlik Yönetmek
+
+ Kimlik düzenlemek
+ Yeni kimlik
+
+ Bcc bütün mesajlar to
+ Her giden mesajın bir kopyasını bu adrese gönder
+
+ Düzenle
+ Yukarı hareket
+ Aşağı hareket
+ En üste taşı / varsayılan yap
+ Kaldır
+
+ Kimlik Tanımlama
+ (İsteğe bağlı)
+ İsminiz
+ (İsteğe bağlı)
+ Eposta adresi
+ (Gerekli)
+ Cevap adresi
+ (İsteğe bağlı)
+ İmza
+ (İsteğe bağlı)
+
+ İmza kullan
+ İmza
+ Gönderdiğiniz her mesaja bir imza atın
+
+ -- \n Android için K-9 Posta\'dan gönderidi. Lütfen bu kısa notumu mazur görün.
+ İlk kimlik
+ Kimlik seç
+ Kimlik seç
+ Hesap/Kimlik seç
+ Olarak gönderin
+
+ Hesap ayarlarına gidin -> Kimlikleri yönetin kimlikleri yaratın
+ Sadece kimliğinizi kaldıramazsınız
+ Bir eposta adressiz bir kimlik kullanamazsınız
+ Kimliğinizin seçimi ve imzası değişimi bir taslak ile kaydedilmeyecek
+
+ En erken mesajlar ilk
+ En son mesajlar ilk
+ Göndereni alfabetik sırala
+ Göndereni ters alfabetik sırala
+ Konuyu alfabetik sırala
+ Konuyu ters alfabetik sırala
+ Yıldızlı mesajlar ilk
+ Yıldızsız mesajlar ilk
+ Okunmamış mesajlar ilk
+ Okunmuş mesajlar ilk
+ Ekli mesajlar ilk
+ Eksiz mesajlar ilk
+
+ Göre sırala...
+ Tarih
+ Gönderici
+ Konu
+ Yıldız
+ Okundu/Okunmadı
+ Ekler
+ %s
+
+ Hesabı Kaldır
+ Hesap \"%s\" K-9 Mail\'den kaldırılacak.
+
+ Hesabı canlandırmak
+ Bütün bilgi için \"%s\" K-9 Mail\'den kaldırılacak, fakat hesap ayarları korunacak.
+
+ Hesabı Temizle
+ Bütün mesajlar içinde \"%s\" K-9 Mail\'den kaldırılacak, fakat hesap ayarları korunacak.
+
+ Sadece bazı \"Plus\" hesaplar bu programın POP
+ erişiminden bağlanmasına izin verir.Eğer doğru eposta adresi ve şifre ile
+ oturum açamıyorsanız, \"Plus\" hesap için bir ödeme yapmamışsınız demektir.
+ Lütfen Web gezginini bu posta hesaplarına erişebilmek için başlatın.
+ Bu sağlayıcı için POP3 kullanmak isterseniz, Yahoo Mail ayarlar sayfasında POP3 kullanmak için vermelisiniz.
+ Bu sağlayıcı için IMAP veya POP3 kullanmak isterseniz, Naver mail ayarlar sayfasında IMAP veya POP3 kullanmaya izin vermelisiniz.
+ Bu sağlayıcı için IMAP veya POP3 kullanmak isterseniz, Hanmail (Daum) mail ayarlar sayfasında IMAP veya POP3 kullanmaya izin vermelisiniz .
+ Bu sağlayıcı için IMAP ve POP3 kullanmak isterseniz, Paran mail ayarlar sayfasında IMAP veya POP3 kullanmaya izin vermelisiniz.
+ Bu sağlayıcı için IMAP ve POP3 kullanmak isterseniz, Nate mail ayarlar sayfasında IMAP veya POP3 kullanmaya izin vermelisiniz.
+
+ Tanınmayan Sertifika
+ Kabul Tuşu
+ Reddetme Tuşu
+
+ Del (or D) - Sil\u000AR -
+ Cevapla\u000AA - Hepsini cevapla\u000AF - İlet\u000AJ or P - Önceki
+ Mesaj\u000AK, N - Sonraki Mesaj\u000AM - Taşı\u000AY - Kopyala\u000AZ - Uzaklaş\u000AShift-Z -
+ Yakınlaş\u000aG - Yıldız
+ Del (or D) - Sil\u000AR -
+ Cevapla\u000AA - Hepsini cevapla\u000AC - Oluştur\u000AF - İlet\u000aM -
+ Taşı\u000AY - Kopyala\u000AG - Yıldız\u000AO - Sıralama tipi\u000AI - Sıralama şekli\u000AQ
+ - Klasörlere dön\u000AS - Seç/seçme\u000AZ - Geçiş oku/okuma\u000A/
+ - Ara\u000A5 - Postayı kontrol et
+
+
+ 1 - Yanlız 1nci Sınıf Klasörleri göster\u000A
+ 2 - Yanlız 1nci ve 2nci Sınıf klasörleri göster\u000A
+ 3 - 2nci Sınıf klasörler hariç hepsini göster\u000A
+ 4 - Bütün klasörleri göster\u000A
+ Q - Hesaplara dön\u000A
+ S - Hesap ayarlarını düzenle
+
+ Klasörler
+ Bütün klasörleri göster
+ Sadece 1nci Sınıf klasörleri göster
+ 1nci ve 2nci Sınıf klasörleri göster
+ 2nci Sınıf klasörler hariç hepsini göster
+
+ İmza Konumu
+ Saklanan metinden önce
+ Saklanan metinden sonra
+ Karanlık
+ Aydınlık
+ Görüntü
+ Genel
+ Hata ayıklama
+ Özel
+ Ağ
+ Etkileşim
+ Hesap Listesi
+ Mesaj Listeleri
+ Mesajlar
+ Tema
+ Dil
+
+ Tek sütun düzeni
+ Daha küçük ekranlar için HTML mesajları yeniden biçimlendir
+ Sistem yakınlaştırma kontrolleri
+ Yakınlaştırma araçlarını veya cihazınız onu destekliyorsa pinch-zoom\'u etkinleştir
+
+ Sistem Varsayılanları
+
+ Arkaplan senkronizasyonu
+ Asla
+ Daima
+ \'Background data\' işaretli olduğu zaman
+ \'Background data\' & \'Auto-sync\' işaretli olduğu zaman
+
+ Mesaj Seçilmedi
+
+ Tarih Biçimi
+
+
+ Yığın Seçenekleri
+ Seçileni Sil
+ Seçilmiş olanı okundu işaretle
+ Seçilmiş olanı okunmadı işaretle
+ Seçilmiş olana Yıldız ekle
+ Seçilmi olandan Yıldızı kaldır
+ Seçilmişi Arşive Taşı
+ Seçilmişi Spam\'a Taşı
+ Seçileni Taşı
+ Seçileni Kopyala
+ Yıldız modu
+ Seçim modu
+ Düz mod
+ Hepsini Seç
+ Bütün seçimleri temizle
+
+ push ile max klasörü kontrol et
+ 10 klasör
+ 25 klasör
+ 50 klasör
+ 100 klasör
+ 250 klasör
+ 500 klasör
+ 1000 klasör
+
+ Animasyon
+ Gösterişli görsel efektleri kullan
+ Hareketleri
+ Hareket kontrolünü kabul et
+
+ Kompakt düzen
+ Herbir sayfada daha fazlasını görüntülemek için düzeni ayarla
+
+ Ses Düğmesi ile dolaşma
+ Ses kontrollerini kullanarak ürün sayfalarını çevir
+ Mesaj görünümü
+ Çeşitli liste görünümleri
+
+ Yönet \"Geri\" düğmesi
+ Yap \"Geri\" daima bir üst seviyeye çıkart
+
+ Birleşik Gelen Kutusu ile başla
+ Başlangıçta Birleşik Gelen Kutusunu göster
+
+ Hesap boyutunu göster
+ Daha hızlı görüntüleme için kapatın
+
+ Arama sayısı sonuçları
+ Daha hızlı görüntüleme için kapatın
+
+ Özel hesapları sakla
+ Bütün mesaj hesaplarını ve birleşik gelen kutusunu sakla
+
+ %s%s
+ - Yıldızlı
+ - Okunmadı
+
+ Bütün mesajlar
+ Bütün mesajlar aranabilir klasörlerde
+
+ Birleşik Gelen Kutusu
+ Bütün mesajlar birleşik gelen kutusunda
+
+ Okunmamış veya yıldızlı mesajlar için yıldızı veya zarfı tıklayın
+
+ Birleştirmek
+ Birleşik Gelen Kutusunda bütün mesajlar görünür
+
+ Arama için Klasörler
+ Hepsi
+ Görüntülenebilir
+ Hiçbiri
+
+ K-9 Posta\'ya uzaktan erişim
+ Bu programın K-9 Mail aktiviteleri ve ayarlarını kontrol edebilmesine izin ver.
+
+ Yazı tipi Boyutu
+ Yazı tipi boyutunu yapılandır
+
+ Hesap listesi
+ Hesap adı
+ Hesap tanımı
+
+ Klasör listeleri
+ Klasör adı
+ Klasör durumu
+
+ Mesaj listeleri
+ Konu
+ Gönderen
+ Tarih
+ Önizleme
+
+ Mesajlar
+ Gönderen
+ Kime
+ Cc
+ Ek başlıklar
+ Konu
+ Zaman
+ Tarih
+ Mesaj gövdesi
+
+ Çok küçük
+ Küçücük
+ Daha küçük
+ Küçük
+ Orta
+ Büyük
+ Daha büyük
+
+ En küçük
+ Daha küçük
+ Normal
+ Daha büyük
+ En büyük
+
+
+ Kontrol et \"Ayarlar\" -> \"Use Gallery bug work-around\" 3D Galeri kullanarak imajlar veya videoları eklemeyi dene.
+
+
+ Kullan \"Ek Ekle (İmaj)\" veya \"Ek Ekle (Video)\" 3D Galeri ile imajları ve videoları eklemeyi.
+
+ Çeşitli
+ Geçici çözüm galeri hatasını kullan
+ İmaj/Video ekleri ekleme butonlarını göster (Bir galeri 3D hatası geçici çözümüne)
+
+
+ Bu eylem için uygun program bulunamadı.
+ Kurulu APG versiyon desteklenmiyor.
+ İşaret
+ Şifrelemek
+ Çözmek
+ Doğrulamak
+ <unknown>
+ id: %s
+ K-9 tamamiyle APG erişimine izin vermez, lütfen bunu düzeltmek için K-9\'i yeniden kurun.
+ PGP/MIME mesajları henüz desteklenmiyor.
+ Uyarı: Ekler henüz işaretli veya şifreli değil.
+ İptal gönder.
+
+ Taslak mesajı kaydet?
+ Bu mesajı kaydet veya at?
+
+ Bu mesaj görüntülemez çünkü karakterler \"%s\" bulunamadı.
+
+ Kopyalamak için metni seç.
+
+ Silmeyi onayla
+ Bu mesajı silmek istiyormusunuz?
+ Sil
+ Silme
+
+ Spam klasörüne taşımayı onayla
+
+ Bu mesajı gerçekten Spam klasörüne taşımak istiyormusunuz?
+ Gerçekten taşımak istiyormusunuz %1$d mesajları Spam klasörüne?
+
+
+ Evet
+ Hayır
+
+ Ek indiriliyor
+
+ Hata günlüğü Android günlük sistemine etkinleştirildi. pay
+
+ »
+ ›
+ Bağlanılamadı.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hesap \"%s\" mevcut değil; depolamayı kontrol et
+
+ Ekleri kaydet...
+ Ekleri kaydet
+ Dosya gezgini bulunamadı. Bu eki nereye kaydetmek isterdiniz?
+
+
+
+
+
+
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 645aa8ff7..96b44f504 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -6,9 +6,7 @@
作者: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotes更新日志: %s
- http://code.google.com/p/k9mail/
@@ -85,8 +83,6 @@
删除账户取消挂起的操作(慎用)
-
-
账户◀◀
@@ -111,6 +107,9 @@
显示/隐藏详细信息添加抄送/暗送编辑主题
+
+
+
添加附件添加图片附件添加视频附件
@@ -257,8 +256,7 @@
一些附件没有被下载。在这个邮件发送前会自动的下载这些附件。由于一些附件还没有被下载,因此无法转发这些附件。
-
-
+
发件人:%s <%s>收件人:
@@ -278,7 +276,6 @@
正在接收附件。无法打开%s。找不到可以阅读该文件的程序。
-
下载完整邮件
@@ -305,7 +302,6 @@
关于%s版本:%s
-
显示星标星标指示标记过的邮件复选框
@@ -325,6 +321,8 @@
使用定宽字体显示纯文本邮件删除后回到自动返回到列表邮件删除后自动返回到邮件列表
+
+
确认操作进行选择操作时总是显示一个对话框进行确认
@@ -337,13 +335,11 @@
锁屏通知屏幕锁定时不要在通知栏中显示邮件主题
-
-
设置新账户输入该账户的电子邮件地址:(你还可以再添加%d个账户)
@@ -415,8 +411,8 @@
接收邮件时手动
+
IMAP路径前缀
- (如果可能则自动使用NAMESPACE)草稿箱名称发件箱名称
@@ -507,7 +503,6 @@
1000封
-
没有与服务器同步的邮件无法进行拷贝或移动无法完成设置
@@ -551,6 +546,9 @@
正在发送邮件
+
+
+
在引用的文本后进行回复回复邮件时,原始邮件会显示在您的邮件的上方。
@@ -558,6 +556,9 @@
+
+
+
@@ -581,7 +582,6 @@
-
账户颜色选择账户在文件夹和账户列表中显示时所使用的颜色
@@ -603,6 +603,8 @@
512Kb1Mb2Mb
+ 5Mb
+ 10Mb任意(无限制)同步该时段内的邮件
@@ -619,7 +621,6 @@
六个月内一年内
-
显示的文件夹全部仅初级文件夹
@@ -694,7 +695,6 @@
闪烁LED灯有新邮件时闪烁LED灯
-
服务器设置撰写新邮件选项
@@ -742,7 +742,6 @@
选择账户/身份标识
-
请使用“账户设置”->“管理身份标识”来创建身份标识您必须保留一个身份标识身份标识中必须包含电子邮件地址
@@ -780,8 +779,11 @@
账户“%s”中的全部邮件将从K-9 Mail中删除,但是账户设置将保留。只有一些“高级账户”允许POP访问并允许该程序连接。如果您使用了正确的用户名和密码却仍旧无法登录,则您可能没有购买这些“高级账户”。请使用浏览器来访问这些账户。
-
+
+
+
+
无法识别的证书信息接收密钥
@@ -809,8 +811,6 @@
显示初级和次级文件夹仅不显示次级文件夹
-
-
签名位置在引用的文本之前在引用的文本之后
@@ -833,8 +833,6 @@
系统放大控制如果设备支持则启用放大插件或多点触摸放大
-
-
系统默认值后台同步
@@ -1007,7 +1005,20 @@
不要删除
-
+
@@ -1019,9 +1030,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 7d8b579ff..f0ca10ed2 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -1,199 +1,1064 @@
-
- 將會從電子郵件中移除 \"%s\" 帳號。
- 移除
- 帳號設定
- 新增其它帳號
- 預設帳號
- 根據預設,從此帳號傳送電子郵件
- 帳號名稱
- 內送設定
- 設定內送電子郵件伺服器
- 電子郵件檢查頻率
- 您的名字
- 電子郵件通知
- 電子郵件到達時在狀態列顯示通知
- 外寄設定
- 設定外寄電子郵件伺服器
- 顯示合併收件匣
- 帳號設定
- IMAP 帳號
- 此帳號的類型?
- POP3 帳號
- 加入新的電子郵件帳號
- 根據預設,從此帳號傳送電子郵件。
- 已經新增 %s。
- %s 不是有效的電子郵件地址。
- 電子郵件地址
- 輸入帳號的電子郵件地址:
- (您尚可新增 %d 個帳號。)
- 手動設定
- 密碼
- 設定電子郵件
- 正在取消\u2026
- 正在檢查傳入伺服器設定\u2026
- 正在檢查傳出伺服器設定\u2026
- 正在結束\u2026
- 正在擷取帳號資訊\u2026
- 使用者名稱或密碼不正確。\n(%s)
- 無法安全地連線到伺服器。\n(%s)
- 編輯詳細資料
- 無法連線到伺服器。\n(%s)
- 無法結束設定
- 帳號已經完成設定!\n\n正在預取電子郵件\u2026
- 7 天之後
- 從收件匣刪除時
- 從伺服器刪除電子郵件:
- 永不
- 可省略
- IMAP 路徑字首
- IMAP 伺服器
- 密碼
- POP3 伺服器
- 連接埠
- 安全性類型
- 無
- SSL (永遠)
- SSL (若有的話)
- TLS (永遠)
- TLS (如果有的話)
- 內送伺服器設定
- 使用者名稱
- 設定帳號名稱 (可省略):
- 帳號已經完成設定,正在傳送電子郵件!
- 設定電子郵件
- 輸入名稱 (顯示在傳出訊息):
- 根據預設,從此帳號傳送電子郵件。
- 每 10 分鐘
- 每 15 分鐘
- 每小時
- 每 30 分鐘
- 每 5 分鐘
- 電子郵件檢查頻率
- 永不
- 電子郵件到達時通知我。
- 帳號選項
- 使用者名稱與密碼
- 密碼
- 使用者名稱
- IMAP 優先,其次 SMTP
- 驗證類型
- POP 優先,其次 SMTP
- 密碼
- 連接埠
- 需要登入。
- 安全性類型
- 無
- SSL
- TLS (永遠)
- TLS (如果有的話)
- SMTP 伺服器
- 外寄伺服器設定
- 使用者名稱
- 帳號
- 帳號選項
- 您的帳號
- 歡迎使用電子郵件設定!\n\n您可以使用任何的電子郵件帳號發送電子郵件。\n\n只要簡單的兩個步驟,即可完成常用之電子郵件帳號的設定!
- 新增帳號
- 新增附件
- 新增副本/密件副本
- 電子郵件
- 取消
- 來自所有帳號的最近訊息
- 所有電子郵件收件匣
- 所有電子郵件
- 撰寫
- 撰寫
- 繼續
- 偵錯
- 版本:%s
- 刪除
- 放棄
- 完成
- 刪除設定
- 編輯主旨
- 清空垃圾筒
- 資料夾
- 转发
- (無主旨)
- 新增資料夾
- 資料夾
- 標記為已讀取
- 標記為未讀取
- 由於尚未下載附件;因此無法轉寄。
- 密件副本
- 副本
- 某些附件未下載。在傳送此訊息之前,將會自動下載附件。
- 必須新增至少一位收件者。
- -------- 原始郵件 --------
- 主旨:
- 寄件者:
- 收件者:
- 副本:
- 引用的文字
- \n%s 說:\n\n
- 主旨
- 收件者
- 複製的訊息。
- 刪除的訊息。
- 放棄的訊息。
- 載入更多訊息
- %s (%d)
- 移動的訊息。
- 儲存為草稿的訊息。
- 儲存
- 開啟
- yyyy MMM dd hh:mm a
- 正在取得附件。
- \u25BC
- \u25B2
- 顯示圖片
- 選取 \"顯示圖片\" 即可顯示內嵌的圖片。
- 無法將附件儲存到 SD 卡。
- 將儲存到 SD 卡的附件做為 %s。
- 收件者:
- 移到
- 新資料夾名稱
- 下一步
- 在 %d 帳號中
- %d 封未讀 (%s)
- 來自 %s 的新電子郵件
- 新增電子郵件
- 尚未傳送訊息
- 確定
- 開啟
- 偏好設定
- 只有某些 \"Plus\" 帳號才有包括
- 允許此程式連線存取的 POP。如果無法利用
- 正確的電子郵件地址及帳號登入,則表示您可能沒有申請付費的
- \"Plus\" 帳號。請啟動網頁瀏覽器,以便取得
- 這些郵件帳號的存取權限。
- 讀取
- 允許此應用程式讀取電子郵件附件。
- 讀取電子郵件附件
- 重新整理
- 移除帳號
- 移除
- 回覆
- 全部回覆
- 重試
- 儲存為草稿
- 搜尋
- 傳送
- 草稿
- 收件匣
- 寄件匣
- 寄件日期
- 垃圾筒
- 錯誤
- 正在載入\u2026
- 載入訊息中\u2026
- 重試載入更多訊息
- 連線錯誤
- 正在傳送\u2026
- 檢視/隱藏詳細資料
- Unrecognized Certificate
- Accept Key
- Reject Key
+
+ K-9 Mail
+ K-9 Mail測試版
+ 谷歌以及幫著遛K-9的小朋友們。
+
+
+ 作者: %s
+ 更新日誌: %s
+
+
+
+ 顯示附件
+ 允許該程式讀取附件。
+ 顯示郵件
+ 允許該程式讀取郵件。
+ 刪除郵件
+ 允許該程式刪除郵件。
+
+ 關於%s
+ 帳戶
+ 高級
+ %s
+ K-9帳戶
+
+ %s:%s
+
+ 新郵件
+ 除錯
+ 選擇文件匣
+ 選擇顏色
+
+ %s%s%s
+
+ \u0020〔%d〕
+ \u0020(正在接收%s:%s%s)
+ \u0020(正在接收郵件訊息%s:%s%s)
+ \u0020(正在寄送%s%s)
+ \u0020(正在處理%s:%s%s)
+ \u0020%s/%s
+
+ \u0020(下次接收時間:%s)
+
+
+
+ 下一步
+ 上一步
+ 確定
+ 取消
+ 寄送
+ 再次寄送
+ 選擇
+ 取消選擇
+ 回覆
+ 全部回覆
+ 刪除
+ 歸檔
+ 標記為垃圾
+ 清空文件匣
+ 轉寄
+ 移動
+ 繼續
+ 完成
+ 刪除
+ 忽略
+ 保存為草稿
+ 重試
+ 重整
+ 檢查新郵件
+ 寄送
+ 全部文件匣
+ 重整文件匣
+ 標記全部郵件為已讀
+ 添加帳戶
+ 新郵件
+ 搜索
+ 搜索結果
+ 設置
+ 打開
+ 帳戶設置
+ 文件匣設置
+ 全域設置
+ 刪除帳戶
+ 取消暫停的操作(慎用)
+
+
+
+ 帳戶
+ ◄
+ ►
+ 閱讀
+ 標記為已讀
+ 共享
+ 選擇寄件人
+
+ 標記全部郵件為已讀
+ 標記「%s」中全部的郵件(包括K-9中沒有顯示的文件匣中的郵件)為已讀麼?
+
+
+ 添加星標
+ 移除星標
+ 複製
+ 顯示詳細訊息
+ 隱藏詳細訊息
+ 選擇本文
+
+ 標記為未讀
+ 移動到
+ 文件匣
+ 顯示/隱藏詳細訊息
+ 添加抄送/密送
+ 編輯主題
+ 讀取回條
+ 要求讀取回條
+ 取消讀取回條
+ 添加附件
+ 添加圖片附件
+ 添加視頻附件
+ 導出設置
+ 清空垃圾桶
+ 刪除
+ 清除本地郵件
+ 選擇排序方式
+ 逆序
+ 關於
+
+ 設置
+ 帳戶選項
+ 文件匣選項
+
+ (無主題)
+ 無日期
+ 無寄件人
+ 正在接收
+ (正在接收%s%s)
+ 正在加載郵件\u2026
+ 連接錯誤
+ 郵件未找到
+ 錯誤
+ 正在寄送
+
+ 再次嘗試加載更多郵件
+
+ 再加載%d封郵件
+
+ GB
+ MB
+ KB
+ B
+
+ 帳戶「%s」已從%s縮小到%s
+
+ 正在壓縮帳戶「%s」
+ 正在清理帳戶「%s」
+ 正在重建帳戶「%s」
+
+ 您有新郵件
+ 您有來自%s的新郵件
+ 您有%d封未讀郵件(%s)
+ 您有%d封新郵件(%s)
+ 於帳戶%d
+ 郵件沒有寄送
+
+ 正在檢查郵件:%s:%s
+ 正在檢查郵件
+ 正在寄送郵件:%s
+ 正在寄送郵件
+ :
+
+ 收件匣
+ 寄件備份
+
+ 草稿
+ 垃圾桶
+ 寄件備份
+ 歸檔
+ 垃圾郵件
+
+
+ %s(草稿)
+ %s(垃圾桶)
+ %s(已寄送)
+ %s(歸檔)
+ %s(垃圾郵件)
+
+ 一些郵件沒有成功寄送
+ 請檢查您的%s以便獲取更多訊息。
+ K-9在試圖寄送一些郵件時遇到了問題。而且更加悲劇的是由於技術上的原因,K-9不清楚這些郵件有沒有成功的寄送。因此收件人可能已經收到了這些訊息。\u000a\u000a遇到問題的郵件保存在寄件備份裡面並且被加了星標。在你取消了這些郵件的星標之後K-9將會試著再次寄送這些郵件。長按「寄件備份」並點擊「寄送郵件」以便再次寄送。\u000A\u000a「%s」文件匣有可能包含關於這些錯誤的細節訊息。
+
+ K-9警報
+ 由於沒有網路,同步和寄送操作被暫停。
+
+ 沒有其他郵件了
+
+
+感謝安裝K-9。K-9是Android下的開源電子郵件客戶端,其最初的代碼來自Android默認的電子郵件程式。
+\n
+\n\nK-9改進的功能包括:
+\n * 利用IMAP IDEL進行Push mail
+\n * 更好的性能
+\n * 重新裝入郵件
+\n * 郵件簽名
+\n * 密送給自己
+\n * 文件匣訂閱
+\n * 同步全部文件匣
+\n * 可以編輯回件地址
+\n * 鍵盤快捷鍵
+\n * 更好的IMAP支持
+\n * 保存附件到SD卡
+\n * 清空垃圾桶
+\n * 郵件排序
+\n * 以及其他很多哦~
+\n
+\n請注意K-9不支持絕大多數免費Hotmail帳戶,以及,和很多郵件客戶端一樣,在和Microsoft Exchange溝通的時候存在一些詭異的問題。
+\n
+\n請到http://k9mail.googlecode.com/提交錯誤報告、貢獻新功能或提出您的問題。
+
+
+
+ 版本:%s
+ 啟用除錯日誌
+ 記錄額外的除錯訊息
+ 記錄敏感訊息
+ 允許在日誌中顯示密碼。
+
+ K-9 Mail for Android
+
+ 全部郵件
+ 全部帳戶的最近郵件
+ 全部郵件收件匣
+
+ %s:%s
+ %s
+ %s
+ %s
+ %s
+ 加載更多郵件
+ 收件人:%s
+ 刪除
+ 標記為已讀
+ 標記為未讀
+ 添加星標
+ 移除星標
+
+ 收件人
+ 抄送
+ 密送
+ 主題
+ 郵件內容
+ --------原始郵件--------
+ 主題:
+ 收到日期:
+ 寄件人:
+ 收件人:
+ 抄送:
+ %s寫到:\n\n
+ 引用本文
+ 您必須添加至少一個收件人。
+ 未發現電子郵件地址
+ 一些附件沒有被下載。在這個郵件寄送前會自動的下載這些附件。
+ 由於一些附件還沒有被下載,因此無法轉寄這些附件。
+ 引用郵件
+
+
+ 寄件人:%s <%s>
+ 收件人:
+ 抄送:
+ 打開
+ 保存
+ \u25BC
+ \u25B2
+ 歸檔
+ 移動
+ 標記為垃圾
+ MMM dd yyyy hh:mm a
+ 附件已經保存到SD卡:%s。
+ 無法將附件保存到SD卡。
+ 選擇「顯示圖片」來顯示簽入的圖片。
+ 顯示圖片
+ 正在接收附件。
+ 無法打開%s。找不到可以閱讀該文件的程式。
+
+
+ 下載完整郵件
+
+
+ 當前只下載了部分郵件的訊息。如果需要下載全部郵件的訊息,請在帳戶的內送伺服器設置中選擇「在手機上保存全部郵件的訊息」。
+ 全部郵件的訊息都已經下載,但是當前沒有額外的郵件訊息可以顯示。
+ 從資料庫或郵件伺服器獲取額外的郵件訊息失敗。
+
+ 文件匣
+ 新文件匣
+
+ 新文件匣名
+
+ (推送)
+
+ 來自這個寄件人的更多郵件
+
+ 郵件已複製
+ 郵件已移動
+ 郵件已刪除
+ 郵件已忽略
+ 郵件已保存為草稿
+ 無法刪除郵件
+
+ 關於%s
+ 版本:%s
+
+
+ 顯示星標
+ 星標指示標記過的郵件
+ 複選框
+ 總是顯示多選框
+ 郵件預覽
+ 在列表中顯示郵件預覽
+ 預覽行數
+ 顯示聯繫人姓名
+ 如果可能則使用聯繫人姓名代替收件地址
+ 顯示聯絡人姓名
+ 如果可能則使用聯絡人姓名代替收件地址
+ 使用顏色標記特定人
+ 不使用顏色標記特定人列表
+ 使用顏色標記特定人列表
+
+ 定寬字體
+ 使用定寬字體顯示純本文郵件
+ 刪除後自動返回到列表
+ 郵件刪除後自動返回到郵件列表
+ 刪除並顯示下一郵件
+ 刪除郵件後自動顯示下一郵件
+
+ 確認操作
+ 進行選擇操作時總是顯示一個對話框進行確認
+ 歸檔
+ 刪除(僅用於郵件視圖)
+ 標記為垃圾
+ 全部標示為已讀取
+ 寄送
+
+ 鎖屏通知
+ 屏幕鎖定時不要在通知欄中顯示郵件主題
+
+
+ 靜音
+ 取消夜間響鈴, 鬧鐘及閃光
+ 啟動靜音
+ 結束靜音
+
+
+ 設置新帳戶
+ 輸入該帳戶的電子郵件地址:
+ (你還可以再添加%d個帳戶)
+ 電子郵件地址
+ %s不是一個有效的電子郵件地址。
+ %s已經添加。
+ 密碼
+ 默認使用這個帳戶寄送郵件
+ 手動設置
+
+
+ 正在獲取帳戶訊息\u2026
+ 正在檢查內送伺服器設置\u2026
+ 正在檢查外寄伺服器設置\u2026
+ 驗證\u2026
+ 取回帳戶設置\u2026
+ 正在完成最後的操作\u2026
+ 正在取消\u2026
+
+ 快要完成了!
+ 你的帳戶已經設置,並且正在接收郵件!
+ 為這個帳戶選擇一個名稱(可選項):
+ 輸入你的名字(將顯示在發出的郵件中):
+
+ 你的帳戶已經設置完畢!\n\n正在接收郵件\u2026
+
+ 帳戶類型
+ 這個帳戶是什麼類型的?
+ POP3
+ IMAP
+ WebDAV (Exchange)
+
+ 郵件伺服器設置
+ 用戶名
+ 密碼
+ POP3伺服器
+ IMAP伺服器
+ WebDAV (Exchange)伺服器
+ 埠口號
+ 加密方法
+ 身份驗證方法
+ 無
+ SSL(如果可能的話)
+ SSL(總是)
+ TLS(如果可能的話)
+ TLS(總是)
+
+ 當我刪除郵件時
+ 不要從伺服器上刪除
+ 7天後從伺服器上刪除
+ 立刻從伺服器上刪除
+ 在伺服器上將郵件標記為已讀
+
+ 在以下網路上使用壓縮以便節約流量:
+ 手機移動網路
+ Wi-Fi
+ 其他
+
+ 下載郵件訊息
+ 在本地保存全部郵件的訊息
+
+ 外部儲存 (SD卡)
+ 手機內部儲存
+ %1$s 額外內部儲存
+ 儲存位置
+
+ 抹掉刪除的郵件
+ 立刻
+ 接收郵件時
+ 手動
+
+
+ IMAP路徑前綴
+
+ 草稿名稱
+ 寄件備份名稱
+ 垃圾桶名稱
+ 歸檔文件匣名稱
+ 垃圾郵件匣名稱
+
+ 只顯示訂閱的文件匣
+ 自動展開文件匣
+
+ WebDAV (Exchange)路徑
+ 可選
+
+ 身份驗證路徑
+ 可選
+ 郵箱路徑
+ 可選
+
+ 外寄伺服器設置
+ SMTP伺服器
+ 埠口號
+ 加密方法
+ 無
+ SSL
+ TLS(如果可能的話)
+ TLS(總是)
+ 要求登錄。
+ 用戶名
+ 密碼
+ 身份驗證方法
+
+ 用戶名與密碼
+ 用戶名
+ 密碼
+ 在SMTP前POP
+ 在SMTP前IMAP
+ 在SMTP前WebDAV (Exchange)
+
+ 無效的設置:%s
+
+ 帳戶選項
+
+ 壓縮
+ 清除郵件(慎用)
+ 重建資料(最後的殺手鑭)
+
+ 文件匣檢查頻率
+
+ 從不
+ 每分鐘一次
+ 五分鐘一次
+ 十分鐘一次
+ 十五分鐘一次
+ 三十分鐘一次
+ 每小時一次
+ 兩小時一次
+ 三小時一次
+ 六小時一次
+ 十二小時一次
+ 二十四小時一次
+
+ 被推送時檢查郵件
+ 在這個帳戶上啟用推送郵件
+ 如果你的郵件伺服器支持這個功能,那麼新郵件將會立刻顯示在手機上。這個選項可能大幅的提升性能,也可能嚴重的影響性能。
+ 重整間隔連接
+ 每分鐘一次
+ 兩分鐘一次
+ 三分鐘一次
+ 六分鐘一次
+ 十二分鐘一次
+ 二十四分鐘一次
+ 三十六分鐘一次
+ 四十八分鐘一次
+ 六十分鐘一次
+
+ 默認使用這個帳戶寄送郵件
+ 有新郵件時通知我
+ 檢查新郵件時通知我
+
+
+ 郵件顯示數量
+ 10封
+ 25封
+ 50封
+ 100封
+ 250封
+ 500封
+ 1000封
+ 全部郵件
+
+
+ 沒有與伺服器同步的郵件無法進行複製或移動
+
+ 無法完成設置
+ 用戶名或密碼錯誤。\n(%s)
+ 無法使用加密方法連接到伺服器。\n(%s)
+ 無法連接到伺服器。\n(%s)
+ 編輯詳細訊息
+ 繼續
+
+ 高級
+ 通用設置
+ 默認帳戶
+ 默認帳戶
+ 默認使用這個帳戶寄送郵件
+ 新郵件通知
+ 同步通知
+ 您的電子郵件地址
+ 新郵件到達時在通知欄中顯示通知
+ 檢查新郵件時在通知欄中顯示通知
+ 顯示全域郵件夾
+ 包括正在寄送的郵件
+ 寄送郵件時顯示通知
+ 點擊通知後打開未讀郵件
+ 點擊通知後搜索未讀郵件
+ 顯示未讀郵件數
+ 在通知欄上顯示未讀郵件數
+
+ 滾動導航按鈕
+ 從不
+ 使用鍵盤時
+ 總是
+
+ 啟用整理按鈕
+ 顯示歸檔、移動和標記為垃圾按鈕
+ 滾動整理按鈕
+
+ 顯示圖片
+ 從不
+ 來自您的聯絡人的郵件
+ 全部郵件
+
+ 正在寄送郵件
+
+ 回覆時引用原文
+ 回覆郵件時,引用原始郵件內容
+
+ 在引用的本文後進行回覆
+ 回覆郵件時,原始郵件會顯示在您的郵件的上方。
+
+ 郵件格式
+ 純文字 (圖像和編排會被移除)
+ HTML (圖像和編排會被保存)
+
+ 讀取回條
+ 永遠要求讀取回條
+
+ 回覆時的引用樣式
+ 前綴 (如同 Gmail, Pine)
+ 段落 (如同 Outlook, Yahoo!, Hotmail)
+
+ 一般設置
+ 顯示
+ 正在接收郵件
+ 文件匣
+ 正在整理郵件
+ 正在顯示郵件
+ 引用本文前綴
+ 加密
+ OpenPGP提供者
+ 無
+ 不可用
+ 自動簽名
+ 使用帳戶的電子郵件地址自動猜測簽名密鑰。
+
+ 文件匣檢查頻率
+ 第二組檢查頻率
+
+ 帳戶儲存
+
+
+ 帳戶顏色
+ 選擇帳戶在文件匣和帳戶列表中顯示時所使用的顏色
+
+ 通知LED燈顏色
+ 選擇手機提示該帳戶訊息時LED燈閃爍的顏色
+
+ 本地文件匣大小
+
+ 收取郵件的最大尺寸為
+ 1Kb
+ 2Kb
+ 4Kb
+ 8Kb
+ 16Kb
+ 32Kb
+ 64Kb
+ 128Kb
+ 256Kb
+ 512Kb
+ 1Mb
+ 2Mb
+ 5Mb
+ 10Mb
+ 任意(無限制)
+
+ 同步該時段內的郵件
+ 任意時段(無限制)
+ 今天
+ 兩天內
+ 三天內
+ 一周內
+ 兩周內
+ 三周內
+ 一個月內
+ 兩個月內
+ 三個月內
+ 六個月內
+ 一年內
+
+
+ 顯示的文件匣
+ 全部
+ 僅上層文件匣
+ 上層與下層文件匣
+ 除了下層文件匣
+
+ 檢查文件匣
+ 全部
+ 僅上層文件匣
+ 上層與下層文件匣
+ 除了下層文件匣
+ 無
+
+ 推送文件匣
+ 全部
+ 僅上層文件匣
+ 上層與下層文件匣
+ 除了下層文件匣
+ 無
+
+ 可以移動/複製到的文件匣
+ 全部
+ 僅上層文件匣
+ 上層與下層文件匣
+ 除了下層文件匣
+
+ 同步伺服器上的刪除
+ 刪除在伺服器上被刪除的郵件的本地複製
+
+ 文件匣設置
+
+ 顯示在置頂的組中
+ 顯示在置頂的組之後
+
+ 文件匣顯示層別
+ 無
+ 上層
+ 下層
+
+ 文件匣同步層別
+ 無
+ 上層
+ 下層
+ 使用與顯示層別相同的層別
+
+ 文件匣推送層別
+ 無
+ 上層
+ 下層
+ 使用與同步層別相同的層別
+
+ 內送伺服器
+ 配置內送伺服器
+ 外寄伺服器
+ 配置外寄(SMTP)伺服器
+ 添加另一個帳戶
+ 帳戶名稱
+ 您的名字
+ 通知
+ 有新郵件時震鈴
+ 震動
+ 有新郵件時震動
+ 震動模式
+ 默認
+ 模式一
+ 模式二
+ 模式三
+ 模式四
+ 模式五
+ 重複震動
+ 新郵件鈴聲
+ 閃爍LED燈
+ 有新郵件時閃爍LED燈
+
+
+ 伺服器設置
+
+ 撰寫新郵件選項
+ 撰寫新郵件默認值
+ 設置默認的寄件人、按送以及簽名
+
+ 管理身份標識
+ 設置一個可選的寄件地址和簽名
+
+ 管理身份標識
+
+ 管理身份標識
+
+ 編輯身份標識
+ 新身份標識
+
+ 密送全部郵件到
+ 將每一封發出郵件複製一份並寄送到這個地址
+
+ 編輯
+ 上移
+ 下移
+ 置頂/設為默認
+ 刪除
+
+ 身份標識描述訊息
+ (可選)
+ 您的姓名
+ (可選)
+ 電子郵件地址
+ (必填)
+ 回覆地址
+ (可選)
+ 簽名
+ (可選)
+
+ 使用簽名
+ 簽名
+ 將簽名附加到每一封發出的郵件後面
+
+ -- \n抱歉暫時無法詳細說明。這份郵件是使用安裝有K-9 Mail的Android移動設備寄送的。
+ 初始身份標識
+ 選擇身份標識
+ 選擇身份標識
+ 選擇帳戶/身份標識
+ 以身份寄送
+
+
+ 請使用「帳戶設置」->「管理身份標識」來創建身份標識
+ 您必須保留一個身份標識
+ 身份標識中必須包含電子郵件地址
+ 您的選擇的身份標識以及簽名不會隨著草稿進行保存
+
+ 優先顯示最早的郵件
+ 優先顯示最近的郵件
+ 按寄件人升序
+ 按寄件人降序
+ 按主題升序
+ 按主題降序
+ 優先顯示帶有星標的郵件
+ 優先顯示沒有星標的郵件
+ 優先顯示未讀郵件
+ 優先顯示已讀郵件
+ 優先顯示帶有附件的郵件
+ 優先顯示沒有附件的郵件
+
+ 排序方式
+ 日期
+ 寄件人
+ 主題
+ 星標
+ 已讀/未讀
+ 附件
+ %s
+
+ 刪除帳戶
+ 帳戶「%s」將從K-9 Mail中刪除。
+
+ 重建帳戶
+ 帳戶「%s」的全部資料將從K-9 Mail中刪除,但是帳戶設置將保留。
+
+ 清除帳戶
+ 帳戶「%s」中的全部郵件將從K-9 Mail中刪除,但是帳戶設置將保留。
+
+ 只有一些「高級帳戶」允許POP訪問並允許該程式連接。如果您使用了正確的用戶名和密碼卻仍舊無法登錄,則您可能沒有購買這些「高級帳戶」。請使用瀏覽器來訪問這些帳戶。
+
+ 要使用此提供者的POP3服務,請先至Yahoo郵箱設置頁設定POP3使用許可。
+
+ 要使用此提供者的IMAP或POP3,請先至Naver郵箱設置頁設定允許使用IMAP或POP3。
+ 要使用此提供者的IMAP或POP3,請先至Hanmail(Daum)郵箱設置頁設定允許使用IMAP或POP3。
+ 要使用此提供者的IMAP或POP3,請先至Paran郵箱設置頁設定允許使用IMAP或POP3。
+ 要使用此提供者的IMAP或POP3,請先至Nate郵箱設置頁設定允許使用IMAP或POP3。
+
+ 無法識別的證書訊息
+ 接收密鑰
+ 拒絕密鑰
+
+ Del (or D) - 刪除\u000AR -
+ 回覆\u000AA - 全部回覆\u000AF - 轉寄\u000AJ or P - 上一封郵件\u000AK, N - 下一封郵件\u000AM - 移動\u000AY - 複製\u000AZ - 縮小\u000AShift-Z -
+ 放大\u000aG - 星標
+ Del (or D) - 刪除\u000AR -
+ 回覆\u000AA - 全部回覆\u000AC - 新郵件\u000AF - 轉寄\u000aM -
+ 移動\u000AY - 複製\u000AG - 星標\u000AO - 排序方式\u000AI - 升序/降序\u000AQ
+ - 返回文件匣\u000AS - 選擇/取消選擇
+
+
+ 1 - 只顯示上層文件匣\u000A
+ 2 - 顯示上層和下層文件匣\u000A
+ 3 - 僅不顯示下層文件匣\u000A
+ 4 - 顯示全部文件匣\u000A
+ Q - 返回全部帳戶\u000A
+ S - 編輯帳戶設置
+
+ 文件匣
+ 顯示全部文件匣
+ 只顯示上層文件匣
+ 顯示上層和下層文件匣
+ 僅不顯示下層文件匣
+
+
+
+ 簽名位置
+ 在引用的本文之前
+ 在引用的本文之後
+ 灰暗
+ 明亮
+ 顯示
+ 全域
+ 除錯
+ 隱私
+ 網路
+ 交互
+ 帳戶列表
+ 郵件列表
+ 郵件
+ 主題
+ 語言
+
+ 單列佈局
+ 為小屏幕重新佈局HTML郵件
+ 系統放大控制
+ 如果設備支持則啟用放大插件或多點觸摸放大
+
+
+
+ 系統默認值
+
+ 背景同步
+ 從不
+ 總是
+ 當「背景資料」被勾選
+ 當「背景資料」&「自動同步」被勾選
+
+ 沒有選擇任何郵件
+
+ 日期格式
+
+ 簡短
+ 一般
+ dd-MMM-yyyy
+ yyyy-MM-dd
+
+ 整批操作
+ 刪除勾選的郵件
+ 將勾選的郵件標記為已讀
+ 將勾選的郵件標記為未讀
+ 為勾選的郵件添加星標
+ 為勾選的郵件移除星標
+ 移動勾選的郵件到歸檔文件匣
+ 移動勾選的郵件到垃圾郵件文件匣
+ 移動勾選的郵件
+ 複製勾選的郵件
+ 星標模式
+ 選擇模式
+ 水平模式
+ 選擇全部
+ 清除全部選擇
+
+ 推送時最多檢查文件匣數量
+ 十個文件匣
+ 二十五個文件匣
+ 五十個文件匣
+ 一百個文件匣
+ 二百五十個文件匣
+ 五百個文件匣
+ 一千個文件匣
+
+ 動畫
+ 使用絢麗的視覺特效
+ 手勢
+ 接收手勢控制
+
+ 精簡格式
+ 在一頁上顯示最多的訊息
+
+ 音量鍵導航
+ 利用音量鍵選擇項目
+ 訊息視圖
+ 不同的列表視圖
+
+ 管理「返回」按鈕
+ 每次點擊「返回」按鈕時都向上返回一個層次
+
+ 從全域收件匣啟動
+ 啟動後顯示全域收件匣
+
+ 顯示帳戶佔用的空間
+ 關閉該功能以便加快顯示速度
+
+ 計算搜索結果的數量
+ 關閉該功能以便加快顯示速度
+
+ 隱藏特殊帳戶
+ 隱藏inbox收件匣與郵件帳戶名稱
+
+ %s%s
+ - 星標
+ - 未讀
+
+ 所有郵件
+ 可搜索文件匣中的所有郵件
+
+ 全域收件匣
+ 全域收件匣中的所有郵件
+
+ 點擊信封或星標來標記郵件為未讀或添加星標
+
+ 全域
+ 所有郵件都顯示在全域收件匣中
+
+ 搜索的文件匣
+ 全部
+ 可顯示的文件匣
+ 無
+
+ 遠程控制K-9 Mail
+ 運行這個程式控制K-9 Mail的行為和設置。
+
+ 字體大小
+ 配置字體大小
+
+ 帳戶列表
+ 帳戶名稱
+ 帳戶描述
+
+ 文件匣列表
+ 文件匣名稱
+ 文件匣狀態
+
+ 管理列表
+ 主題
+ 寄件人
+ 日期
+ 預覽
+
+ 郵件
+ 寄件人
+ 收件人
+ 抄送
+ 額外的郵件訊息
+ 主題
+ 時間
+ 日期
+ 郵件內容
+
+ 最小
+ 更小
+ 小
+ 較小
+ 中等
+ 大
+ 更大
+
+ 最小
+ 較小
+ 正常
+ 較大
+ 更大
+
+
+ 選擇「設置」->「避免畫冊發生錯誤」來啟用使用3D畫冊模式添加附件或視頻。
+
+
+ 利用「添加附件(圖片)」或「添加附件(視頻)」來使用3D畫冊添加圖片或視頻。
+
+ 雜項
+ 避免畫冊發生錯誤
+ 顯示按鈕來添加圖片/視頻附件(以避免3D畫冊發生錯誤)
+
+
+ 沒有找到可以用於這一操作的程式。
+ 不支持所安裝版本的APG。
+ 簽名
+ 加密
+ 解密
+ 驗證
+ <未知>
+ id: %s
+ K-9沒有被允許完全訪問APG,請重新安裝K-9以便修復這一問題。
+ 暫時還不支持PGP/MIME郵件。
+ 警告:附件還 *沒有* 被簽名或者加密。
+ 寄送操作已經取消。
+
+ 保存郵件草稿?
+ 保存還是忽略這封郵件?
+
+ 由於沒有找到字符集「%s」,該郵件無法顯示。
+
+ 選擇需要複製的本文。
+
+ 刪除確認
+ 你確定要刪除這封郵件麼?
+ 刪除
+ 不要刪除
+
+ 移至垃圾桶時確認
+
+ 確定要將郵件移至垃圾桶嗎?
+ 確定要將選取的 %1$d 封郵件移至垃圾桶嗎?
+
+
+ 是
+ 否
+
+ 下載附件
+
+ 已經啟用將除錯日誌寫入Andorid日誌系統
+
+ ≫
+ ≻
+ 無法連線
+
+ 帳戶 \"%s\" 無法使用; 請檢查儲存
+
+ 另存附件...
+ 保存附件
+ 找不到檔案瀏覽器,您要將附件保存到哪裡?
+
+ 上移
+ 下移
+
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 68b88c018..d33328ccb 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -112,6 +112,9 @@
@string/account_settings_autodownload_message_size_512@string/account_settings_autodownload_message_size_1024@string/account_settings_autodownload_message_size_2048
+ @string/account_settings_autodownload_message_size_5120
+ @string/account_settings_autodownload_message_size_10240
+ @string/account_settings_autodownload_message_size_any
@@ -127,6 +130,9 @@
52428810485762097152
+ 5242880
+ 10485760
+ 0
@@ -485,6 +491,7 @@
cacs
+ dadeenes
@@ -493,10 +500,12 @@
glitja
+ hunlplpt_BRru
+ trzh_TWzh_CNfi
@@ -669,11 +678,13 @@
@string/account_settings_message_format_text@string/account_settings_message_format_html
+ @string/account_settings_message_format_autoTEXTHTML
+ AUTO
diff --git a/res/values/constants.xml b/res/values/constants.xml
new file mode 100644
index 000000000..77d07dc2b
--- /dev/null
+++ b/res/values/constants.xml
@@ -0,0 +1,5 @@
+
+
+ https://github.com/k9mail/k-9/wiki/ReleaseNotes
+ http://code.google.com/p/k9mail/
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index bdcd6ddd6..79a9efa0e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5,10 +5,9 @@
Google, The K-9 Dog Walkers.Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project.Licensed under the Apache License, Version 2.0.
+ <p>HtmlCleaner is distributed under BSD License. It gives the freedom for anyone to use, explore, modify, and distribute HtmlCleaner, but without any warranty.</p><p>Copyright (c) 2006-2011, HtmlCleaner team.<br>All rights reserved.</p><p>Redistribution and use of this software in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p><p><ul><li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li><li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li><li>The name of HtmlCleaner may not be used to endorse or promote products derived from this software without specific prior written permission.</li></ul></p><p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>Authors: %s
- http://code.google.com/p/k9mail/wiki/ReleaseNotesRevision Information: %s
- http://code.google.com/p/k9mail/We\'re using the following third-party libraries: %sEmoji icons: %s
@@ -62,6 +61,7 @@
ForwardMoveContinue
+ BackDoneRemoveDiscard
@@ -72,6 +72,7 @@
Send messagesFolder listRefresh folders
+ Find folderMark all messages as readAdd accountCompose
@@ -85,8 +86,6 @@
Remove accountClear pending actions (danger!)
-
-
Accounts◀◀
@@ -112,6 +111,9 @@
View/hide detailsAdd Cc/BccEdit subject
+ Read receipt
+ Read receipt will be requested
+ Read receipt will not be requestedAdd attachmentAdd attachment (Image)Add attachment (Video)
@@ -272,7 +274,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Some attachments cannot be forwarded because they have not been downloaded.Quote message
-
From: %s <%s>To:Cc:
@@ -291,7 +292,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Fetching attachment.Unable to find viewer for %s.
-
Download complete message
@@ -318,7 +318,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
About %sVersion: %s
-
Show starsStars indicate flagged messagesMulti-select checkboxes
@@ -338,11 +337,14 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Use a fixed-width font when showing plain-text messagesReturn to list after deleteReturn to message list after message deletion
+ Show next message after delete
+ Show next message by default after message deletionConfirm actionsShow a dialog whenever you perform selected actionsArchiveDelete (message view only)
+ Delete Starred (message view only)SpamMark all as readSend
@@ -350,13 +352,11 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Lock-screen notificationsDon\'t display message subject in notification bar when system is locked
-
Quiet TimeDisable ringing, buzzing and flashing at nightQuiet Time startsQuiet Time ends
-
Set up a new accountEnter this account\'s email address:(You may add %d more accounts.)
@@ -428,8 +428,8 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
When pollingOnly manually
+ Auto-detect IMAP namespaceIMAP path prefix
- (Automatic using NAMESPACE if available)Drafts folderSent folder
@@ -520,7 +520,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
1000 messagesall messages
-
Cannot copy or move a message that is not synchronized with the serverSetup could not finish
@@ -570,9 +569,16 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Reply after quoted textWhen replying to messages, the original message will appear above your reply.
+ Strip signature from quoted reply
+ When replying to messages, the signature of the quoted text will be stripped
+
Message FormatPlain Text (images and formatting will be removed)HTML (images and formatting are preserved)
+ Automatic (plain text unless replying to an HTML message)
+
+ Read receipt
+ Always request a read receiptReply quoting stylePrefix (like Gmail, Pine)
@@ -591,13 +597,14 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
not availableAuto-signUse the account\'s email address to guess the signature key.
+ Auto-encrypt
+ Automatically set encrypt if a public key matches a recipient.Folder poll frequency2nd class check frequencyStorage
-
Account colorChoose the color of the account used in folder and account list
@@ -619,6 +626,8 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
512Kb1Mb2Mb
+ 5Mb
+ 10Mbany size (no limit)Sync messages from
@@ -635,7 +644,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
the last 6 monthsthe last year
-
Folders to displayAllOnly 1st Class folders
@@ -710,7 +718,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Blink LEDBlink LED when mail arrives
-
Server settingsMessage composition options
@@ -758,7 +765,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Choose account/identitySend as
-
Go to Account Settings -> Manage Identities to create identitiesYou can\'t remove your only identityYou can\'t use an identity without an email address
@@ -800,14 +806,12 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
your correct email address and password, you may not have a paid
\"Plus\" account. Please launch the Web browser to gain access to
these mail accounts.
-
If you would like to use POP3 for this provider, You should permit to use POP3 on Yahoo mail settings page.
-
If you would like to use IMAP or POP3 for this provider, You should permit to use IMAP or POP3 on Naver mail settings page.If you would like to use IMAP or POP3 for this provider, You should permit to use IMAP or POP3 on Hanmail(Daum) mail settings page.If you would like to use IMAP or POP3 for this provider, You should permit to use IMAP or POP3 on Paran mail settings page.If you would like to use IMAP or POP3 for this provider, You should permit to use IMAP or POP3 on Nate mail settings page.
-
+
Unrecognized CertificateAccept KeyReject Key
@@ -829,14 +833,14 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Q - Return to Accounts\u000A
S - Edit Account Settings
+ folder name contains
+
FoldersDisplay all foldersDisplay only 1st Class foldersDisplay 1st and 2nd Class foldersDisplay all except 2nd Class folders
-
-
Signature positionBefore quoted textAfter quoted text
@@ -859,8 +863,6 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
System zoom controlsEnable zoom widgets or pinch-zoom if your device supports it
-
-
System defaultBackground sync
@@ -984,6 +986,9 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
DateMessage body
+ Message composition
+ Text input fields
+
TiniestTinySmaller
@@ -1025,6 +1030,15 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Save draft message?Save or Discard this message?
+ Discard message?
+ Are you sure you want to discard this message?
+
+ Refuse to save draft message.
+ Refuse to save draft message marked encrypted.
+
+ Continue without public key?
+ One or more recipients do not have a saved public key. Continue?
+
This message can\'t be displayed because the charset \"%s\" wasn\'t found.Select text to copy.
@@ -1035,7 +1049,21 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Do not deleteConfirm move to spam folder
- Do you really want to move this message to the spam folder?
+
+ Do you really want to move this message to the spam folder?
+ Do you really want to move %1$d messages to the spam folder?
+
+ YesNo
@@ -1047,10 +1075,63 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
›Unable to connect.
+ Settings Import & Export
+ Export account settings
+ Export settings and accounts
+ Import
+ Export
+ Import settings
+ Import selection
+ Global settings
+ Exporting settings...
+ Importing settings...
+ Scanning file...
+ Saved exported settings to %s
+ Imported global settings from %s
+ Imported %s from %s
+
+ 1 account
+ %s accounts
+
+ Failed to export settings
+ Failed to import any settings from %s
+ Export succeeded
+ Export failed
+ Import succeeded
+ Import failed
+ Activate account
+ To be able to use the account \"%s\" you need to provide the %s.
+
+ server password
+ server passwords
+
+ Incoming server (%s):
+ Outgoing server (%s):
+
+ Setting password...
+ Setting passwords...
+
+ Use the incoming server password
+ Activate
+
+ Unable to handle file of version %s
+
Account \"%s\" is unavailable; check storageSave attachments to...Save attachmentNo file browser found. Where would you like to save this attachment?
+ Move up
+ Move down
+ Moving account...
+
+ K-9 Unread
+ Show unread count for…
+
+ Missing File Manager Application
+ There is no suitable application to handle
+the import operation. Please install a file manager application from Android Market
+ Open Market
+ Close
diff --git a/res/xml/account_settings_preferences.xml b/res/xml/account_settings_preferences.xml
index f30ed0065..a852549f5 100644
--- a/res/xml/account_settings_preferences.xml
+++ b/res/xml/account_settings_preferences.xml
@@ -232,6 +232,12 @@
android:entries="@array/account_settings_message_format_entries"
android:entryValues="@array/account_settings_message_format_values" />
+
+
+
+
+
+
diff --git a/res/xml/font_preferences.xml b/res/xml/font_preferences.xml
index 7df5d3f5e..52606d089 100644
--- a/res/xml/font_preferences.xml
+++ b/res/xml/font_preferences.xml
@@ -160,4 +160,18 @@
+
+
+
+
+
+
diff --git a/res/xml/global_preferences.xml b/res/xml/global_preferences.xml
index d3297c942..58c41afdf 100644
--- a/res/xml/global_preferences.xml
+++ b/res/xml/global_preferences.xml
@@ -217,6 +217,12 @@
android:title="@string/global_settings_messageview_return_to_list_label"
android:summary="@string/global_settings_messageview_return_to_list_summary" />
+
+
+
+
+
+
diff --git a/res/xml/unread_widget_info.xml b/res/xml/unread_widget_info.xml
new file mode 100644
index 000000000..f2a7b27b0
--- /dev/null
+++ b/res/xml/unread_widget_info.xml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/src/com/fsck/k9/Account.java b/src/com/fsck/k9/Account.java
index 69df089ca..3d49694b6 100644
--- a/src/com/fsck/k9/Account.java
+++ b/src/com/fsck/k9/Account.java
@@ -18,10 +18,13 @@ import com.fsck.k9.mail.store.StorageManager;
import com.fsck.k9.mail.store.StorageManager.StorageProvider;
import com.fsck.k9.view.ColorChip;
+import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
+import java.util.Collections;
import java.util.Date;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
@@ -41,7 +44,7 @@ public class Account implements BaseAccount {
/**
* This local folder is used to store messages to be sent.
*/
- public static final String OUTBOX = "OUTBOX";
+ public static final String OUTBOX = "K9MAIL_INTERNAL_OUTBOX";
public static final String EXPUNGE_IMMEDIATELY = "EXPUNGE_IMMEDIATELY";
public static final String EXPUNGE_MANUALLY = "EXPUNGE_MANUALLY";
@@ -57,11 +60,23 @@ public class Account implements BaseAccount {
public static final String TYPE_OTHER = "OTHER";
private static final String[] networkTypes = { TYPE_WIFI, TYPE_MOBILE, TYPE_OTHER };
- private static final MessageFormat DEFAULT_MESSAGE_FORMAT = MessageFormat.HTML;
- private static final QuoteStyle DEFAULT_QUOTE_STYLE = QuoteStyle.PREFIX;
- private static final String DEFAULT_QUOTE_PREFIX = ">";
- private static final boolean DEFAULT_QUOTED_TEXT_SHOWN = true;
- private static final boolean DEFAULT_REPLY_AFTER_QUOTE = false;
+ public static final MessageFormat DEFAULT_MESSAGE_FORMAT = MessageFormat.HTML;
+ public static final boolean DEFAULT_MESSAGE_FORMAT_AUTO = false;
+ public static final boolean DEFAULT_MESSAGE_READ_RECEIPT = false;
+ public static final QuoteStyle DEFAULT_QUOTE_STYLE = QuoteStyle.PREFIX;
+ public static final String DEFAULT_QUOTE_PREFIX = ">";
+ public static final boolean DEFAULT_QUOTED_TEXT_SHOWN = true;
+ public static final boolean DEFAULT_REPLY_AFTER_QUOTE = false;
+ public static final boolean DEFAULT_STRIP_SIGNATURE = true;
+
+ public static final String ACCOUNT_DESCRIPTION_KEY = "description";
+ public static final String STORE_URI_KEY = "storeUri";
+ public static final String TRANSPORT_URI_KEY = "transportUri";
+
+ public static final String IDENTITY_NAME_KEY = "name";
+ public static final String IDENTITY_EMAIL_KEY = "email";
+ public static final String IDENTITY_DESCRIPTION_KEY = "description";
+
/**
*
@@ -125,16 +140,30 @@ public class Account implements BaseAccount {
// current set of fetched messages
private boolean mRingNotified;
private MessageFormat mMessageFormat;
+ private boolean mMessageFormatAuto;
+ private boolean mMessageReadReceipt;
private QuoteStyle mQuoteStyle;
private String mQuotePrefix;
private boolean mDefaultQuotedTextShown;
private boolean mReplyAfterQuote;
+ private boolean mStripSignature;
private boolean mSyncRemoteDeletions;
private String mCryptoApp;
private boolean mCryptoAutoSignature;
+ private boolean mCryptoAutoEncrypt;
private CryptoProvider mCryptoProvider = null;
+ /**
+ * Indicates whether this account is enabled, i.e. ready for use, or not.
+ *
+ *
+ * Right now newly imported accounts are disabled if the settings file didn't contain a
+ * password for the incoming and/or outgoing server.
+ *
+ */
+ private boolean mEnabled;
+
/**
* Name of the folder that was last selected for a copy or move operation.
*
@@ -168,7 +197,7 @@ public class Account implements BaseAccount {
}
public enum MessageFormat {
- TEXT, HTML
+ TEXT, HTML, AUTO
}
protected Account(Context context) {
@@ -203,13 +232,18 @@ public class Account implements BaseAccount {
maximumPolledMessageAge = -1;
maximumAutoDownloadMessageSize = 32768;
mMessageFormat = DEFAULT_MESSAGE_FORMAT;
+ mMessageFormatAuto = DEFAULT_MESSAGE_FORMAT_AUTO;
+ mMessageReadReceipt = DEFAULT_MESSAGE_READ_RECEIPT;
mQuoteStyle = DEFAULT_QUOTE_STYLE;
mQuotePrefix = DEFAULT_QUOTE_PREFIX;
mDefaultQuotedTextShown = DEFAULT_QUOTED_TEXT_SHOWN;
mReplyAfterQuote = DEFAULT_REPLY_AFTER_QUOTE;
+ mStripSignature = DEFAULT_STRIP_SIGNATURE;
mSyncRemoteDeletions = true;
mCryptoApp = Apg.NAME;
mCryptoAutoSignature = false;
+ mCryptoAutoEncrypt = false;
+ mEnabled = true;
searchableFolders = Searchable.ALL;
@@ -277,10 +311,16 @@ public class Account implements BaseAccount {
maximumPolledMessageAge = prefs.getInt(mUuid + ".maximumPolledMessageAge", -1);
maximumAutoDownloadMessageSize = prefs.getInt(mUuid + ".maximumAutoDownloadMessageSize", 32768);
mMessageFormat = MessageFormat.valueOf(prefs.getString(mUuid + ".messageFormat", DEFAULT_MESSAGE_FORMAT.name()));
+ mMessageFormatAuto = prefs.getBoolean(mUuid + ".messageFormatAuto", DEFAULT_MESSAGE_FORMAT_AUTO);
+ if (mMessageFormatAuto && mMessageFormat == MessageFormat.TEXT) {
+ mMessageFormat = MessageFormat.AUTO;
+ }
+ mMessageReadReceipt = prefs.getBoolean(mUuid + ".messageReadReceipt", DEFAULT_MESSAGE_READ_RECEIPT);
mQuoteStyle = QuoteStyle.valueOf(prefs.getString(mUuid + ".quoteStyle", DEFAULT_QUOTE_STYLE.name()));
mQuotePrefix = prefs.getString(mUuid + ".quotePrefix", DEFAULT_QUOTE_PREFIX);
mDefaultQuotedTextShown = prefs.getBoolean(mUuid + ".defaultQuotedTextShown", DEFAULT_QUOTED_TEXT_SHOWN);
mReplyAfterQuote = prefs.getBoolean(mUuid + ".replyAfterQuote", DEFAULT_REPLY_AFTER_QUOTE);
+ mStripSignature = prefs.getBoolean(mUuid + ".stripSignature", DEFAULT_STRIP_SIGNATURE);
for (String type : networkTypes) {
Boolean useCompression = prefs.getBoolean(mUuid + ".useCompression." + type,
true);
@@ -371,23 +411,29 @@ public class Account implements BaseAccount {
mCryptoApp = prefs.getString(mUuid + ".cryptoApp", Apg.NAME);
mCryptoAutoSignature = prefs.getBoolean(mUuid + ".cryptoAutoSignature", false);
+ mCryptoAutoEncrypt = prefs.getBoolean(mUuid + ".cryptoAutoEncrypt", false);
+ mEnabled = prefs.getBoolean(mUuid + ".enabled", true);
}
-
protected synchronized void delete(Preferences preferences) {
+ // Get the list of account UUIDs
String[] uuids = preferences.getPreferences().getString("accountUuids", "").split(",");
- StringBuffer sb = new StringBuffer();
- for (int i = 0, length = uuids.length; i < length; i++) {
- if (!uuids[i].equals(mUuid)) {
- if (sb.length() > 0) {
- sb.append(',');
- }
- sb.append(uuids[i]);
+
+ // Create a list of all account UUIDs excluding this account
+ List newUuids = new ArrayList(uuids.length);
+ for (String uuid : uuids) {
+ if (!uuid.equals(mUuid)) {
+ newUuids.add(uuid);
}
}
- String accountUuids = sb.toString();
+
SharedPreferences.Editor editor = preferences.getPreferences().edit();
- editor.putString("accountUuids", accountUuids);
+
+ // Only change the 'accountUuids' value if this account's UUID was listed before
+ if (newUuids.size() < uuids.length) {
+ String accountUuids = Utility.combine(newUuids.toArray(), ',');
+ editor.putString("accountUuids", accountUuids);
+ }
editor.remove(mUuid + ".storeUri");
editor.remove(mUuid + ".localStoreUri");
@@ -436,12 +482,16 @@ public class Account implements BaseAccount {
editor.remove(mUuid + ".subscribedFoldersOnly");
editor.remove(mUuid + ".maximumPolledMessageAge");
editor.remove(mUuid + ".maximumAutoDownloadMessageSize");
+ editor.remove(mUuid + ".messageFormatAuto");
editor.remove(mUuid + ".quoteStyle");
editor.remove(mUuid + ".quotePrefix");
editor.remove(mUuid + ".showPicturesEnum");
editor.remove(mUuid + ".replyAfterQuote");
+ editor.remove(mUuid + ".stripSignature");
editor.remove(mUuid + ".cryptoApp");
editor.remove(mUuid + ".cryptoAutoSignature");
+ editor.remove(mUuid + ".cryptoAutoEncrypt");
+ editor.remove(mUuid + ".enabled");
editor.remove(mUuid + ".enableMoveButtons");
editor.remove(mUuid + ".hideMoveButtonsEnum");
for (String type : networkTypes) {
@@ -451,6 +501,64 @@ public class Account implements BaseAccount {
editor.commit();
}
+ public static int findNewAccountNumber(List accountNumbers) {
+ int newAccountNumber = -1;
+ Collections.sort(accountNumbers);
+ for (int accountNumber : accountNumbers) {
+ if (accountNumber > newAccountNumber + 1) {
+ break;
+ }
+ newAccountNumber = accountNumber;
+ }
+ newAccountNumber++;
+ return newAccountNumber;
+ }
+
+ public static List getExistingAccountNumbers(Preferences preferences) {
+ Account[] accounts = preferences.getAccounts();
+ List accountNumbers = new LinkedList();
+ for (int i = 0; i < accounts.length; i++) {
+ accountNumbers.add(accounts[i].getAccountNumber());
+ }
+ return accountNumbers;
+ }
+ public static int generateAccountNumber(Preferences preferences) {
+ List accountNumbers = getExistingAccountNumbers(preferences);
+ return findNewAccountNumber(accountNumbers);
+ }
+
+ public void move(Preferences preferences, boolean moveUp) {
+ String[] uuids = preferences.getPreferences().getString("accountUuids", "").split(",");
+ SharedPreferences.Editor editor = preferences.getPreferences().edit();
+ String[] newUuids = new String[uuids.length];
+ if (moveUp) {
+ for (int i = 0; i < uuids.length; i++) {
+ if (i > 0 && uuids[i].equals(mUuid)) {
+ newUuids[i] = newUuids[i-1];
+ newUuids[i-1] = mUuid;
+ }
+ else {
+ newUuids[i] = uuids[i];
+ }
+ }
+ }
+ else {
+ for (int i = uuids.length - 1; i >= 0; i--) {
+ if (i < uuids.length - 1 && uuids[i].equals(mUuid)) {
+ newUuids[i] = newUuids[i+1];
+ newUuids[i+1] = mUuid;
+ }
+ else {
+ newUuids[i] = uuids[i];
+ }
+ }
+ }
+ String accountUuids = Utility.combine(newUuids, ',');
+ editor.putString("accountUuids", accountUuids);
+ editor.commit();
+ preferences.loadAccounts();
+ }
+
public synchronized void save(Preferences preferences) {
SharedPreferences.Editor editor = preferences.getPreferences().edit();
@@ -528,13 +636,26 @@ public class Account implements BaseAccount {
editor.putBoolean(mUuid + ".subscribedFoldersOnly", subscribedFoldersOnly);
editor.putInt(mUuid + ".maximumPolledMessageAge", maximumPolledMessageAge);
editor.putInt(mUuid + ".maximumAutoDownloadMessageSize", maximumAutoDownloadMessageSize);
- editor.putString(mUuid + ".messageFormat", mMessageFormat.name());
+ if (MessageFormat.AUTO.equals(mMessageFormat)) {
+ // saving MessageFormat.AUTO as is to the database will cause downgrades to crash on
+ // startup, so we save as MessageFormat.TEXT instead with a separate flag for auto.
+ editor.putString(mUuid + ".messageFormat", Account.MessageFormat.TEXT.name());
+ mMessageFormatAuto = true;
+ } else {
+ editor.putString(mUuid + ".messageFormat", mMessageFormat.name());
+ mMessageFormatAuto = false;
+ }
+ editor.putBoolean(mUuid + ".messageFormatAuto", mMessageFormatAuto);
+ editor.putBoolean(mUuid + ".messageReadReceipt", mMessageReadReceipt);
editor.putString(mUuid + ".quoteStyle", mQuoteStyle.name());
editor.putString(mUuid + ".quotePrefix", mQuotePrefix);
editor.putBoolean(mUuid + ".defaultQuotedTextShown", mDefaultQuotedTextShown);
editor.putBoolean(mUuid + ".replyAfterQuote", mReplyAfterQuote);
+ editor.putBoolean(mUuid + ".stripSignature", mStripSignature);
editor.putString(mUuid + ".cryptoApp", mCryptoApp);
editor.putBoolean(mUuid + ".cryptoAutoSignature", mCryptoAutoSignature);
+ editor.putBoolean(mUuid + ".cryptoAutoEncrypt", mCryptoAutoEncrypt);
+ editor.putBoolean(mUuid + ".enabled", mEnabled);
editor.putBoolean(mUuid + ".vibrate", mNotificationSetting.shouldVibrate());
editor.putInt(mUuid + ".vibratePattern", mNotificationSetting.getVibratePattern());
@@ -977,6 +1098,18 @@ public class Account implements BaseAccount {
return Store.getRemoteInstance(this);
}
+ // It'd be great if this actually went into the store implementation
+ // to get this, but that's expensive and not easily accessible
+ // during initialization
+ public boolean isSearchByDateCapable() {
+ if (getStoreUri().startsWith("imap")) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
@Override
public synchronized String toString() {
return mDescription;
@@ -1021,18 +1154,17 @@ public class Account implements BaseAccount {
return mUuid.hashCode();
}
-
private synchronized List loadIdentities(SharedPreferences prefs) {
List newIdentities = new ArrayList();
int ident = 0;
boolean gotOne = false;
do {
gotOne = false;
- String name = prefs.getString(mUuid + ".name." + ident, null);
- String email = prefs.getString(mUuid + ".email." + ident, null);
+ String name = prefs.getString(mUuid + "." + IDENTITY_NAME_KEY + "." + ident, null);
+ String email = prefs.getString(mUuid + "." + IDENTITY_EMAIL_KEY + "." + ident, null);
boolean signatureUse = prefs.getBoolean(mUuid + ".signatureUse." + ident, true);
String signature = prefs.getString(mUuid + ".signature." + ident, null);
- String description = prefs.getString(mUuid + ".description." + ident, null);
+ String description = prefs.getString(mUuid + "." + IDENTITY_DESCRIPTION_KEY + "." + ident, null);
final String replyTo = prefs.getString(mUuid + ".replyTo." + ident, null);
if (email != null) {
Identity identity = new Identity();
@@ -1048,7 +1180,7 @@ public class Account implements BaseAccount {
ident++;
} while (gotOne);
- if (newIdentities.size() == 0) {
+ if (newIdentities.isEmpty()) {
String name = prefs.getString(mUuid + ".name", null);
String email = prefs.getString(mUuid + ".email", null);
boolean signatureUse = prefs.getBoolean(mUuid + ".signatureUse", true);
@@ -1070,13 +1202,13 @@ public class Account implements BaseAccount {
boolean gotOne = false;
do {
gotOne = false;
- String email = prefs.getString(mUuid + ".email." + ident, null);
+ String email = prefs.getString(mUuid + "." + IDENTITY_EMAIL_KEY + "." + ident, null);
if (email != null) {
- editor.remove(mUuid + ".name." + ident);
- editor.remove(mUuid + ".email." + ident);
+ editor.remove(mUuid + "." + IDENTITY_NAME_KEY + "." + ident);
+ editor.remove(mUuid + "." + IDENTITY_EMAIL_KEY + "." + ident);
editor.remove(mUuid + ".signatureUse." + ident);
editor.remove(mUuid + ".signature." + ident);
- editor.remove(mUuid + ".description." + ident);
+ editor.remove(mUuid + "." + IDENTITY_DESCRIPTION_KEY + "." + ident);
editor.remove(mUuid + ".replyTo." + ident);
gotOne = true;
}
@@ -1089,11 +1221,11 @@ public class Account implements BaseAccount {
int ident = 0;
for (Identity identity : identities) {
- editor.putString(mUuid + ".name." + ident, identity.getName());
- editor.putString(mUuid + ".email." + ident, identity.getEmail());
+ editor.putString(mUuid + "." + IDENTITY_NAME_KEY + "." + ident, identity.getName());
+ editor.putString(mUuid + "." + IDENTITY_EMAIL_KEY + "." + ident, identity.getEmail());
editor.putBoolean(mUuid + ".signatureUse." + ident, identity.getSignatureUse());
editor.putString(mUuid + ".signature." + ident, identity.getSignature());
- editor.putString(mUuid + ".description." + ident, identity.getDescription());
+ editor.putString(mUuid + "." + IDENTITY_DESCRIPTION_KEY + "." + ident, identity.getDescription());
editor.putString(mUuid + ".replyTo." + ident, identity.getReplyTo());
ident++;
}
@@ -1272,6 +1404,14 @@ public class Account implements BaseAccount {
this.mMessageFormat = messageFormat;
}
+ public synchronized boolean isMessageReadReceiptAlways() {
+ return mMessageReadReceipt;
+ }
+
+ public synchronized void setMessageReadReceipt(boolean messageReadReceipt) {
+ mMessageReadReceipt = messageReadReceipt;
+ }
+
public QuoteStyle getQuoteStyle() {
return mQuoteStyle;
}
@@ -1304,6 +1444,14 @@ public class Account implements BaseAccount {
mReplyAfterQuote = replyAfterQuote;
}
+ public synchronized boolean isStripSignature() {
+ return mStripSignature;
+ }
+
+ public synchronized void setStripSignature(boolean stripSignature) {
+ mStripSignature = stripSignature;
+ }
+
public boolean getEnableMoveButtons() {
return mEnableMoveButtons;
}
@@ -1330,6 +1478,14 @@ public class Account implements BaseAccount {
mCryptoAutoSignature = cryptoAutoSignature;
}
+ public boolean isCryptoAutoEncrypt() {
+ return mCryptoAutoEncrypt;
+ }
+
+ public void setCryptoAutoEncrypt(boolean cryptoAutoEncrypt) {
+ mCryptoAutoEncrypt = cryptoAutoEncrypt;
+ }
+
public String getInboxFolderName() {
return mInboxFolderName;
}
@@ -1377,4 +1533,11 @@ public class Account implements BaseAccount {
return StorageManager.getInstance(K9.app).isReady(localStorageProviderId);
}
+ public synchronized boolean isEnabled() {
+ return mEnabled;
+ }
+
+ public synchronized void setEnabled(boolean enabled) {
+ mEnabled = enabled;
+ }
}
diff --git a/src/com/fsck/k9/EmailAddressAdapter.java b/src/com/fsck/k9/EmailAddressAdapter.java
index d9bb59940..8cb0240d9 100644
--- a/src/com/fsck/k9/EmailAddressAdapter.java
+++ b/src/com/fsck/k9/EmailAddressAdapter.java
@@ -48,7 +48,7 @@ public class EmailAddressAdapter extends ResourceCursorAdapter {
final String name = mContacts.getName(cursor);
final String address = mContacts.getEmail(cursor);
- return new Address(address, name).toString();
+ return (address == null) ? "" : new Address(address, name).toString();
}
@Override
diff --git a/src/com/fsck/k9/FontSizes.java b/src/com/fsck/k9/FontSizes.java
index a45216b2e..5a1ae2a41 100644
--- a/src/com/fsck/k9/FontSizes.java
+++ b/src/com/fsck/k9/FontSizes.java
@@ -27,16 +27,17 @@ public class FontSizes {
private static final String MESSAGE_VIEW_TIME = "fontSizeMessageViewTime";
private static final String MESSAGE_VIEW_DATE = "fontSizeMessageViewDate";
private static final String MESSAGE_VIEW_CONTENT = "fontSizeMessageViewContent";
+ private static final String MESSAGE_COMPOSE_INPUT = "fontSizeMessageComposeInput";
/*
- * Values for the font sizes in DIP (device independent pixel)
+ * Values for the font sizes in SP (Scale-independent Pixels)
*/
- public static final int FONT_10DIP = 10;
- public static final int FONT_12DIP = 12;
+ public static final int FONT_10SP = 10;
+ public static final int FONT_12SP = 12;
public static final int SMALL = 14; // ?android:attr/textAppearanceSmall
- public static final int FONT_16DIP = 16;
+ public static final int FONT_16SP = 16;
public static final int MEDIUM = 18; // ?android:attr/textAppearanceMedium
- public static final int FONT_20DIP = 20;
+ public static final int FONT_20SP = 20;
public static final int LARGE = 22; // ?android:attr/textAppearanceLarge
@@ -122,6 +123,12 @@ public class FontSizes {
*/
private TextSize messageViewContent = TextSize.NORMAL;
+ /**
+ * Font size for the input fields in the message compose activity.
+ */
+ private int messageComposeInput;
+
+
/**
* Create a FontSizes object with default values.
*/
@@ -132,18 +139,20 @@ public class FontSizes {
folderName = LARGE;
folderStatus = SMALL;
- messageListSubject = FONT_16DIP;
+ messageListSubject = FONT_16SP;
messageListSender = SMALL;
messageListDate = SMALL;
messageListPreview = SMALL;
messageViewSender = SMALL;
- messageViewTo = FONT_12DIP;
- messageViewCC = FONT_12DIP;
- messageViewAdditionalHeaders = FONT_12DIP;
- messageViewSubject = FONT_12DIP;
- messageViewTime = FONT_10DIP;
- messageViewDate = FONT_10DIP;
+ messageViewTo = FONT_12SP;
+ messageViewCC = FONT_12SP;
+ messageViewAdditionalHeaders = FONT_12SP;
+ messageViewSubject = FONT_12SP;
+ messageViewTime = FONT_10SP;
+ messageViewDate = FONT_10SP;
+
+ messageComposeInput = MEDIUM;
}
/**
@@ -171,6 +180,8 @@ public class FontSizes {
editor.putInt(MESSAGE_VIEW_TIME, messageViewTime);
editor.putInt(MESSAGE_VIEW_DATE, messageViewDate);
editor.putInt(MESSAGE_VIEW_CONTENT, getMessageViewContentAsInt());
+
+ editor.putInt(MESSAGE_COMPOSE_INPUT, messageComposeInput);
}
/**
@@ -198,6 +209,8 @@ public class FontSizes {
messageViewTime = prefs.getInt(MESSAGE_VIEW_TIME, messageViewTime);
messageViewDate = prefs.getInt(MESSAGE_VIEW_DATE, messageViewDate);
setMessageViewContent(prefs.getInt(MESSAGE_VIEW_CONTENT, 3));
+
+ messageComposeInput = prefs.getInt(MESSAGE_COMPOSE_INPUT, messageComposeInput);
}
public int getAccountName() {
@@ -359,4 +372,12 @@ public class FontSizes {
break;
}
}
+
+ public int getMessageComposeInput() {
+ return messageComposeInput;
+ }
+
+ public void setMessageComposeInput(int messageComposeInput) {
+ this.messageComposeInput = messageComposeInput;
+ }
}
diff --git a/src/com/fsck/k9/K9.java b/src/com/fsck/k9/K9.java
index 60314d288..1da5b4d81 100644
--- a/src/com/fsck/k9/K9.java
+++ b/src/com/fsck/k9/K9.java
@@ -2,7 +2,6 @@
package com.fsck.k9;
import java.io.File;
-import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@@ -23,7 +22,6 @@ import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.text.format.Time;
-import android.text.style.AbsoluteSizeSpan;
import android.util.Log;
import com.fsck.k9.activity.MessageCompose;
@@ -33,6 +31,7 @@ import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.internet.BinaryTempFileBody;
+import com.fsck.k9.provider.UnreadWidgetProvider;
import com.fsck.k9.service.BootReceiver;
import com.fsck.k9.service.MailService;
import com.fsck.k9.service.ShutdownReceiver;
@@ -68,11 +67,6 @@ public class K9 extends Application {
*/
private static List observers = new ArrayList();
- /**
- * @see K9#createAbsoluteSizeSpan(int)
- */
- private static Constructor sAbsoluteSizeSpanConstructor;
-
public enum BACKGROUND_OPS {
WHEN_CHECKED, ALWAYS, NEVER, WHEN_CHECKED_AUTO_SYNC
}
@@ -153,6 +147,7 @@ public class K9 extends Application {
private static boolean mAnimations = true;
private static boolean mConfirmDelete = false;
+ private static boolean mConfirmDeleteStarred = false;
private static boolean mConfirmSpam = false;
private static boolean mConfirmMarkAllAsRead = true;
private static boolean mKeyguardPrivacy = false;
@@ -168,6 +163,7 @@ public class K9 extends Application {
private static int mContactNameColor = 0xff00008f;
private static boolean mMessageViewFixedWidthFont = false;
private static boolean mMessageViewReturnToList = false;
+ private static boolean mMessageViewShowNext = false;
private static boolean mGesturesEnabled = true;
private static boolean mUseVolumeKeysForNavigation = false;
@@ -258,7 +254,7 @@ public class K9 extends Application {
public static final int PUSH_WAKE_LOCK_TIMEOUT = 60000;
- public static final int MAIL_SERVICE_WAKE_LOCK_TIMEOUT = 30000;
+ public static final int MAIL_SERVICE_WAKE_LOCK_TIMEOUT = 60000;
public static final int BOOT_RECEIVER_WAKE_LOCK_TIMEOUT = 60000;
@@ -435,12 +431,14 @@ public class K9 extends Application {
editor.putInt("registeredNameColor", mContactNameColor);
editor.putBoolean("messageViewFixedWidthFont", mMessageViewFixedWidthFont);
editor.putBoolean("messageViewReturnToList", mMessageViewReturnToList);
+ editor.putBoolean("messageViewShowNext", mMessageViewShowNext);
editor.putString("language", language);
editor.putInt("theme", theme);
editor.putBoolean("useGalleryBugWorkaround", useGalleryBugWorkaround);
editor.putBoolean("confirmDelete", mConfirmDelete);
+ editor.putBoolean("confirmDeleteStarred", mConfirmDeleteStarred);
editor.putBoolean("confirmSpam", mConfirmSpam);
editor.putBoolean("confirmMarkAllAsRead", mConfirmMarkAllAsRead);
@@ -461,58 +459,7 @@ public class K9 extends Application {
galleryBuggy = checkForBuggyGallery();
Preferences prefs = Preferences.getPreferences(this);
- SharedPreferences sprefs = prefs.getPreferences();
- DEBUG = sprefs.getBoolean("enableDebugLogging", false);
- DEBUG_SENSITIVE = sprefs.getBoolean("enableSensitiveLogging", false);
- mAnimations = sprefs.getBoolean("animations", true);
- mGesturesEnabled = sprefs.getBoolean("gesturesEnabled", true);
- mUseVolumeKeysForNavigation = sprefs.getBoolean("useVolumeKeysForNavigation", false);
- mUseVolumeKeysForListNavigation = sprefs.getBoolean("useVolumeKeysForListNavigation", false);
- mManageBack = sprefs.getBoolean("manageBack", false);
- mStartIntegratedInbox = sprefs.getBoolean("startIntegratedInbox", false);
- mMeasureAccounts = sprefs.getBoolean("measureAccounts", true);
- mCountSearchMessages = sprefs.getBoolean("countSearchMessages", true);
- mHideSpecialAccounts = sprefs.getBoolean("hideSpecialAccounts", false);
- mMessageListStars = sprefs.getBoolean("messageListStars", true);
- mMessageListCheckboxes = sprefs.getBoolean("messageListCheckboxes", false);
- mMessageListTouchable = sprefs.getBoolean("messageListTouchable", false);
- mMessageListPreviewLines = sprefs.getInt("messageListPreviewLines", 2);
-
- mMobileOptimizedLayout = sprefs.getBoolean("mobileOptimizedLayout", false);
- mZoomControlsEnabled = sprefs.getBoolean("zoomControlsEnabled", false);
-
- mQuietTimeEnabled = sprefs.getBoolean("quietTimeEnabled", false);
- mQuietTimeStarts = sprefs.getString("quietTimeStarts", "21:00");
- mQuietTimeEnds = sprefs.getString("quietTimeEnds", "7:00");
-
- mShowCorrespondentNames = sprefs.getBoolean("showCorrespondentNames", true);
- mShowContactName = sprefs.getBoolean("showContactName", false);
- mChangeContactNameColor = sprefs.getBoolean("changeRegisteredNameColor", false);
- mContactNameColor = sprefs.getInt("registeredNameColor", 0xff00008f);
- mMessageViewFixedWidthFont = sprefs.getBoolean("messageViewFixedWidthFont", false);
- mMessageViewReturnToList = sprefs.getBoolean("messageViewReturnToList", false);
-
- useGalleryBugWorkaround = sprefs.getBoolean("useGalleryBugWorkaround", K9.isGalleryBuggy());
-
- mConfirmDelete = sprefs.getBoolean("confirmDelete", false);
- mConfirmSpam = sprefs.getBoolean("confirmSpam", false);
- mConfirmMarkAllAsRead = sprefs.getBoolean("confirmMarkAllAsRead", true);
-
-
- mKeyguardPrivacy = sprefs.getBoolean("keyguardPrivacy", false);
-
- compactLayouts = sprefs.getBoolean("compactLayouts", false);
- mAttachmentDefaultPath = sprefs.getString("attachmentdefaultpath", Environment.getExternalStorageDirectory().toString());
- fontSizes.load(sprefs);
-
- try {
- setBackgroundOps(BACKGROUND_OPS.valueOf(sprefs.getString("backgroundOperations", "WHEN_CHECKED")));
- } catch (Exception e) {
- setBackgroundOps(BACKGROUND_OPS.WHEN_CHECKED);
- }
-
- K9.setK9Language(sprefs.getString("language", ""));
- K9.setK9Theme(sprefs.getInt("theme", android.R.style.Theme_Light));
+ loadPrefs(prefs);
/*
* We have to give MimeMessage a temp directory because File.createTempFile(String, String)
@@ -558,24 +505,43 @@ public class K9 extends Application {
}
}
+ private void updateUnreadWidget() {
+ try {
+ UnreadWidgetProvider.updateUnreadCount(K9.this);
+ } catch (Exception e) {
+ if (K9.DEBUG) {
+ Log.e(LOG_TAG, "Error while updating unread widget(s)", e);
+ }
+ }
+ }
+
@Override
public void synchronizeMailboxRemovedMessage(Account account, String folder, Message message) {
broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_DELETED, account, folder, message);
+ updateUnreadWidget();
}
@Override
public void messageDeleted(Account account, String folder, Message message) {
broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_DELETED, account, folder, message);
+ updateUnreadWidget();
}
@Override
public void synchronizeMailboxNewMessage(Account account, String folder, Message message) {
broadcastIntent(K9.Intents.EmailReceived.ACTION_EMAIL_RECEIVED, account, folder, message);
+ updateUnreadWidget();
+ }
+
+ @Override
+ public void folderStatusChanged(Account account, String folderName,
+ int unreadMessageCount) {
+ updateUnreadWidget();
}
@Override
public void searchStats(final AccountStats stats) {
- // let observers know a fetch occured
+ // let observers know a fetch occurred
K9.this.sendBroadcast(new Intent(K9.Intents.EmailReceived.ACTION_REFRESH_OBSERVER, null));
}
@@ -584,6 +550,63 @@ public class K9 extends Application {
notifyObservers();
}
+ public static void loadPrefs(Preferences prefs) {
+ SharedPreferences sprefs = prefs.getPreferences();
+ DEBUG = sprefs.getBoolean("enableDebugLogging", false);
+ DEBUG_SENSITIVE = sprefs.getBoolean("enableSensitiveLogging", false);
+ mAnimations = sprefs.getBoolean("animations", true);
+ mGesturesEnabled = sprefs.getBoolean("gesturesEnabled", false);
+ mUseVolumeKeysForNavigation = sprefs.getBoolean("useVolumeKeysForNavigation", false);
+ mUseVolumeKeysForListNavigation = sprefs.getBoolean("useVolumeKeysForListNavigation", false);
+ mManageBack = sprefs.getBoolean("manageBack", false);
+ mStartIntegratedInbox = sprefs.getBoolean("startIntegratedInbox", false);
+ mMeasureAccounts = sprefs.getBoolean("measureAccounts", true);
+ mCountSearchMessages = sprefs.getBoolean("countSearchMessages", true);
+ mHideSpecialAccounts = sprefs.getBoolean("hideSpecialAccounts", false);
+ mMessageListStars = sprefs.getBoolean("messageListStars", true);
+ mMessageListCheckboxes = sprefs.getBoolean("messageListCheckboxes", false);
+ mMessageListTouchable = sprefs.getBoolean("messageListTouchable", false);
+ mMessageListPreviewLines = sprefs.getInt("messageListPreviewLines", 2);
+
+ mMobileOptimizedLayout = sprefs.getBoolean("mobileOptimizedLayout", false);
+ mZoomControlsEnabled = sprefs.getBoolean("zoomControlsEnabled", true);
+
+ mQuietTimeEnabled = sprefs.getBoolean("quietTimeEnabled", false);
+ mQuietTimeStarts = sprefs.getString("quietTimeStarts", "21:00");
+ mQuietTimeEnds = sprefs.getString("quietTimeEnds", "7:00");
+
+ mShowCorrespondentNames = sprefs.getBoolean("showCorrespondentNames", true);
+ mShowContactName = sprefs.getBoolean("showContactName", false);
+ mChangeContactNameColor = sprefs.getBoolean("changeRegisteredNameColor", false);
+ mContactNameColor = sprefs.getInt("registeredNameColor", 0xff00008f);
+ mMessageViewFixedWidthFont = sprefs.getBoolean("messageViewFixedWidthFont", false);
+ mMessageViewReturnToList = sprefs.getBoolean("messageViewReturnToList", false);
+ mMessageViewShowNext = sprefs.getBoolean("messageViewShowNext", false);
+
+ useGalleryBugWorkaround = sprefs.getBoolean("useGalleryBugWorkaround", K9.isGalleryBuggy());
+
+ mConfirmDelete = sprefs.getBoolean("confirmDelete", false);
+ mConfirmDeleteStarred = sprefs.getBoolean("confirmDeleteStarred", false);
+ mConfirmSpam = sprefs.getBoolean("confirmSpam", false);
+ mConfirmMarkAllAsRead = sprefs.getBoolean("confirmMarkAllAsRead", true);
+
+
+ mKeyguardPrivacy = sprefs.getBoolean("keyguardPrivacy", false);
+
+ compactLayouts = sprefs.getBoolean("compactLayouts", false);
+ mAttachmentDefaultPath = sprefs.getString("attachmentdefaultpath", Environment.getExternalStorageDirectory().toString());
+ fontSizes.load(sprefs);
+
+ try {
+ setBackgroundOps(BACKGROUND_OPS.valueOf(sprefs.getString("backgroundOperations", "WHEN_CHECKED")));
+ } catch (Exception e) {
+ setBackgroundOps(BACKGROUND_OPS.WHEN_CHECKED);
+ }
+
+ K9.setK9Language(sprefs.getString("language", ""));
+ K9.setK9Theme(sprefs.getInt("theme", android.R.style.Theme_Light));
+ }
+
private void maybeSetupStrictMode() {
if (!K9.DEVELOPER_MODE)
return;
@@ -596,7 +619,7 @@ public class K9 extends Application {
catch (Exception e) {
// Discard , as it means we're not running on a device with strict mode
- Log.v(K9.LOG_TAG, "Failed to turn on strict mode " + e);
+ Log.v(K9.LOG_TAG, "Failed to turn on strict mode", e);
}
}
@@ -875,6 +898,14 @@ public class K9 extends Application {
mMessageViewReturnToList = messageViewReturnToList;
}
+ public static boolean messageViewShowNext() {
+ return mMessageViewShowNext;
+ }
+
+ public static void setMessageViewShowNext(boolean messageViewShowNext) {
+ mMessageViewShowNext = messageViewShowNext;
+ }
+
public static Method getMethod(Class> classObject, String methodName) {
try {
return classObject.getMethod(methodName, boolean.class);
@@ -936,6 +967,14 @@ public class K9 extends Application {
mConfirmDelete = confirm;
}
+ public static boolean confirmDeleteStarred() {
+ return mConfirmDeleteStarred;
+ }
+
+ public static void setConfirmDeleteStarred(final boolean confirm) {
+ mConfirmDeleteStarred = confirm;
+ }
+
public static boolean confirmSpam() {
return mConfirmSpam;
}
@@ -997,48 +1036,4 @@ public class K9 extends Application {
public static void setAttachmentDefaultPath(String attachmentDefaultPath) {
K9.mAttachmentDefaultPath = attachmentDefaultPath;
}
-
- /**
- * Creates an {@link AbsoluteSizeSpan} object.
- *
- *
- * Android versions prior to 2.0 don't support the constructor with two parameters
- * ({@link AbsoluteSizeSpan#AbsoluteSizeSpan(int, boolean)}). So we have to perform some
- * reflection magic to dynamically load the new constructor on devices that support it.
- * For devices with old Android versions we just use the size as pixels (instead of dip).
- *
- *
- * @param size This is used as the {@code size} parameter for the AbsoluteSizeSpan constructor.
- * @return a AbsoluteSizeSpan object with the specified text size.
- */
- public static AbsoluteSizeSpan createAbsoluteSizeSpan(int size) {
- if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5) {
- // For Android 1.5/1.6 simply use the constructor with only the size parameter.
- // Yes, that will most likely look wrong!
- return new AbsoluteSizeSpan(size);
- }
-
- if (sAbsoluteSizeSpanConstructor == null) {
- try {
- sAbsoluteSizeSpanConstructor = AbsoluteSizeSpan.class.getConstructor(int.class, boolean.class);
- } catch (Exception e) {
- Log.e(K9.LOG_TAG, "Couldn't get the AbsoluteSizeSpan(int, boolean) constructor", e);
-
- // Fallback
- return new AbsoluteSizeSpan(size);
- }
- }
-
- AbsoluteSizeSpan result;
- try {
- result = sAbsoluteSizeSpanConstructor.newInstance(size, true);
- } catch (Exception e) {
- Log.e(K9.LOG_TAG, "Couldn't call the AbsoluteSizeSpan(int, boolean) constructor", e);
-
- // Fallback
- result = new AbsoluteSizeSpan(size);
- }
-
- return result;
- }
}
diff --git a/src/com/fsck/k9/Preferences.java b/src/com/fsck/k9/Preferences.java
index dece28412..cbaa8623b 100644
--- a/src/com/fsck/k9/Preferences.java
+++ b/src/com/fsck/k9/Preferences.java
@@ -3,7 +3,11 @@ package com.fsck.k9;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
+
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Config;
@@ -29,7 +33,8 @@ public class Preferences {
private Storage mStorage;
- private List accounts;
+ private Map accounts = null;
+ private List accountsInOrder = null;
private Account newAccount;
private Context mContext;
@@ -44,16 +49,22 @@ public class Preferences {
}
}
- private synchronized void loadAccounts() {
+ public synchronized void loadAccounts() {
+ accounts = new HashMap();
+ accountsInOrder = new LinkedList();
String accountUuids = getPreferences().getString("accountUuids", null);
if ((accountUuids != null) && (accountUuids.length() != 0)) {
String[] uuids = accountUuids.split(",");
- accounts = new ArrayList(uuids.length);
for (String uuid : uuids) {
- accounts.add(new Account(this, uuid));
+ Account newAccount = new Account(this, uuid);
+ accounts.put(uuid, newAccount);
+ accountsInOrder.add(newAccount);
}
- } else {
- accounts = new ArrayList();
+ }
+ if ((newAccount != null) && newAccount.getAccountNumber() != -1) {
+ accounts.put(newAccount.getUuid(), newAccount);
+ accountsInOrder.add(newAccount);
+ newAccount = null;
}
}
@@ -67,12 +78,7 @@ public class Preferences {
loadAccounts();
}
- if ((newAccount != null) && newAccount.getAccountNumber() != -1) {
- accounts.add(newAccount);
- newAccount = null;
- }
-
- return accounts.toArray(EMPTY_ACCOUNT_ARRAY);
+ return accountsInOrder.toArray(EMPTY_ACCOUNT_ARRAY);
}
/**
@@ -81,17 +87,10 @@ public class Preferences {
* @return all accounts with {@link Account#isAvailable(Context)}
*/
public synchronized Collection getAvailableAccounts() {
- if (accounts == null) {
- loadAccounts();
- }
-
- if ((newAccount != null) && newAccount.getAccountNumber() != -1) {
- accounts.add(newAccount);
- newAccount = null;
- }
+ Account[] allAccounts = getAccounts();
Collection retval = new ArrayList(accounts.size());
- for (Account account : accounts) {
- if (account.isAvailable(mContext)) {
+ for (Account account : allAccounts) {
+ if (account.isEnabled() && account.isAvailable(mContext)) {
retval.add(account);
}
}
@@ -103,28 +102,27 @@ public class Preferences {
if (accounts == null) {
loadAccounts();
}
+ Account account = accounts.get(uuid);
- for (Account account : accounts) {
- if (account.getUuid().equals(uuid)) {
- return account;
- }
- }
-
- if ((newAccount != null) && newAccount.getUuid().equals(uuid)) {
- return newAccount;
- }
-
- return null;
+ return account;
}
public synchronized Account newAccount() {
newAccount = new Account(K9.app);
+ accounts.put(newAccount.getUuid(), newAccount);
+ accountsInOrder.add(newAccount);
return newAccount;
}
public synchronized void deleteAccount(Account account) {
- accounts.remove(account);
+ if (accounts != null) {
+ accounts.remove(account.getUuid());
+ }
+ if (accountsInOrder != null) {
+ accountsInOrder.remove(account);
+ }
+
account.delete(this);
if (newAccount == account) {
@@ -143,7 +141,7 @@ public class Preferences {
if (defaultAccount == null) {
Collection accounts = getAvailableAccounts();
- if (accounts.size() > 0) {
+ if (!accounts.isEmpty()) {
defaultAccount = accounts.iterator().next();
setDefaultAccount(defaultAccount);
}
diff --git a/src/com/fsck/k9/SearchAccount.java b/src/com/fsck/k9/SearchAccount.java
index 79161061d..b990e8d09 100644
--- a/src/com/fsck/k9/SearchAccount.java
+++ b/src/com/fsck/k9/SearchAccount.java
@@ -1,6 +1,3 @@
-/**
- *
- */
package com.fsck.k9;
import java.io.Serializable;
@@ -10,6 +7,10 @@ import android.content.Context;
import com.fsck.k9.mail.Flag;
+/**
+ * This is a meta-Account that represents one or more accounts with filters on them. The filter specification
+ * is defined by {@link com.fsck.k9.activity.SearchModifier}.
+ */
public class SearchAccount implements BaseAccount, SearchSpecification, Serializable {
private static final long serialVersionUID = -4388420303235543976L;
private Flag[] mRequiredFlags = null;
@@ -24,17 +25,14 @@ public class SearchAccount implements BaseAccount, SearchSpecification, Serializ
private String[] folderNames = null;
public SearchAccount(Preferences preferences) {
-
}
- protected synchronized void delete(Preferences preferences) {
+ protected synchronized void delete(Preferences preferences) {
}
public synchronized void save(Preferences preferences) {
-
}
-
public SearchAccount(Context context, boolean nintegrate, Flag[] requiredFlags, Flag[] forbiddenFlags) {
mRequiredFlags = requiredFlags;
mForbiddenFlags = forbiddenFlags;
@@ -78,12 +76,14 @@ public class SearchAccount implements BaseAccount, SearchSpecification, Serializ
public void setQuery(String query) {
this.query = query;
}
+
public String getUuid() {
if (mUuid == null) {
setUuid(UUID.randomUUID().toString());
}
return mUuid;
}
+
public void setUuid(String nUuid) {
mUuid = nUuid;
}
@@ -99,16 +99,20 @@ public class SearchAccount implements BaseAccount, SearchSpecification, Serializ
public void setBuiltin(boolean builtin) {
this.builtin = builtin;
}
+
public String[] getAccountUuids() {
return accountUuids;
}
+
public void setAccountUuids(String[] accountUuids) {
this.accountUuids = accountUuids;
}
+
@Override
public String[] getFolderNames() {
return folderNames;
}
+
public void setFolderNames(String[] folderNames) {
this.folderNames = folderNames;
}
diff --git a/src/com/fsck/k9/activity/AccountList.java b/src/com/fsck/k9/activity/AccountList.java
new file mode 100644
index 000000000..a229702ad
--- /dev/null
+++ b/src/com/fsck/k9/activity/AccountList.java
@@ -0,0 +1,192 @@
+package com.fsck.k9.activity;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.TypedValue;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.fsck.k9.Account;
+import com.fsck.k9.BaseAccount;
+import com.fsck.k9.FontSizes;
+import com.fsck.k9.K9;
+import com.fsck.k9.Preferences;
+import com.fsck.k9.R;
+import com.fsck.k9.SearchAccount;
+
+
+/**
+ * Activity displaying the list of accounts.
+ *
+ *
+ * Classes extending this abstract class have to provide an {@link #onAccountSelected(BaseAccount)}
+ * method to perform an action when an account is selected.
+ *
+ */
+public abstract class AccountList extends K9ListActivity implements OnItemClickListener {
+ private FontSizes mFontSizes = K9.getFontSizes();
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setResult(RESULT_CANCELED);
+
+ setContentView(R.layout.account_list);
+
+ ListView listView = getListView();
+ listView.setOnItemClickListener(this);
+ listView.setItemsCanFocus(false);
+ }
+
+ /**
+ * Reload list of accounts when this activity is resumed.
+ */
+ @Override
+ public void onResume() {
+ super.onResume();
+ new LoadAccounts().execute();
+ }
+
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ BaseAccount account = (BaseAccount) parent.getItemAtPosition(position);
+ onAccountSelected(account);
+ }
+
+ /**
+ * Create a new {@link AccountsAdapter} instance and assign it to the {@link ListView}.
+ *
+ * @param realAccounts
+ * An array of accounts to display.
+ */
+ public void populateListView(Account[] realAccounts) {
+ List accounts = new ArrayList();
+
+ if (displaySpecialAccounts() && !K9.isHideSpecialAccounts()) {
+ BaseAccount integratedInboxAccount = new SearchAccount(this, true, null, null);
+ integratedInboxAccount.setDescription(getString(R.string.integrated_inbox_title));
+ integratedInboxAccount.setEmail(getString(R.string.integrated_inbox_detail));
+
+ BaseAccount unreadAccount = new SearchAccount(this, false, null, null);
+ unreadAccount.setDescription(getString(R.string.search_all_messages_title));
+ unreadAccount.setEmail(getString(R.string.search_all_messages_detail));
+
+ accounts.add(integratedInboxAccount);
+ accounts.add(unreadAccount);
+ }
+
+ accounts.addAll(Arrays.asList(realAccounts));
+ AccountsAdapter adapter = new AccountsAdapter(accounts);
+ ListView listView = getListView();
+ listView.setAdapter(adapter);
+ listView.invalidate();
+ }
+
+ /**
+ * Implementing decide whether or not to display special accounts in the list.
+ *
+ * @return {@code true}, if special accounts should be listed. {@code false}, otherwise.
+ */
+ protected abstract boolean displaySpecialAccounts();
+
+ /**
+ * This method will be called when an account was selected.
+ *
+ * @param account
+ * The account the user selected.
+ */
+ protected abstract void onAccountSelected(BaseAccount account);
+
+ class AccountsAdapter extends ArrayAdapter {
+ public AccountsAdapter(List accounts) {
+ super(AccountList.this, 0, accounts);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final BaseAccount account = getItem(position);
+
+ final View view;
+ if (convertView != null) {
+ view = convertView;
+ } else {
+ view = getLayoutInflater().inflate(R.layout.accounts_item, parent, false);
+ view.findViewById(R.id.active_icons).setVisibility(View.GONE);
+ view.findViewById(R.id.folders).setVisibility(View.GONE);
+ view.getBackground().setAlpha(0);
+ }
+
+ AccountViewHolder holder = (AccountViewHolder) view.getTag();
+ if (holder == null) {
+ holder = new AccountViewHolder();
+ holder.description = (TextView) view.findViewById(R.id.description);
+ holder.email = (TextView) view.findViewById(R.id.email);
+ holder.chip = view.findViewById(R.id.chip);
+
+ view.setTag(holder);
+ }
+
+ String description = account.getDescription();
+ if (account.getEmail().equals(description)) {
+ holder.email.setVisibility(View.GONE);
+ } else {
+ holder.email.setVisibility(View.VISIBLE);
+ holder.email.setText(account.getEmail());
+ }
+
+ if (description == null || description.length() == 0) {
+ description = account.getEmail();
+ }
+
+ holder.description.setText(description);
+
+ if (account instanceof Account) {
+ Account realAccount = (Account) account;
+ holder.chip.setBackgroundColor(realAccount.getChipColor());
+ } else {
+ holder.chip.setBackgroundColor(0xff999999);
+ }
+
+ holder.chip.getBackground().setAlpha(255);
+
+ holder.description.setTextSize(TypedValue.COMPLEX_UNIT_SP,
+ mFontSizes.getAccountName());
+ holder.email.setTextSize(TypedValue.COMPLEX_UNIT_SP,
+ mFontSizes.getAccountDescription());
+
+ return view;
+ }
+
+ class AccountViewHolder {
+ public TextView description;
+ public TextView email;
+ public View chip;
+ }
+ }
+
+ /**
+ * Load accounts in a background thread
+ */
+ class LoadAccounts extends AsyncTask {
+ @Override
+ protected Account[] doInBackground(Void... params) {
+ Account[] accounts = Preferences.getPreferences(getApplicationContext()).getAccounts();
+ return accounts;
+ }
+
+ @Override
+ protected void onPostExecute(Account[] accounts) {
+ populateListView(accounts);
+ }
+ }
+}
diff --git a/src/com/fsck/k9/activity/Accounts.java b/src/com/fsck/k9/activity/Accounts.java
index 37f5a41c8..031785e62 100644
--- a/src/com/fsck/k9/activity/Accounts.java
+++ b/src/com/fsck/k9/activity/Accounts.java
@@ -1,37 +1,99 @@
package com.fsck.k9.activity;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import android.app.Activity;
import android.app.AlertDialog;
+import android.app.Application;
import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
+import android.text.Editable;
+import android.text.TextWatcher;
import android.util.Log;
+import android.util.SparseBooleanArray;
import android.util.TypedValue;
-import android.view.*;
+import android.view.ContextMenu;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.webkit.WebView;
-import android.widget.*;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.CheckBox;
+import android.widget.CheckedTextView;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.RelativeLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
-import com.fsck.k9.*;
-import com.fsck.k9.helper.SizeFormatter;
+import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+
+import com.fsck.k9.Account;
+import com.fsck.k9.AccountStats;
+import com.fsck.k9.BaseAccount;
+import com.fsck.k9.FontSizes;
+import com.fsck.k9.K9;
+import com.fsck.k9.Preferences;
+import com.fsck.k9.R;
+import com.fsck.k9.SearchAccount;
+import com.fsck.k9.SearchSpecification;
+import com.fsck.k9.activity.misc.ExtendedAsyncTask;
+import com.fsck.k9.activity.misc.NonConfigurationInstance;
import com.fsck.k9.activity.setup.AccountSettings;
import com.fsck.k9.activity.setup.AccountSetupBasics;
import com.fsck.k9.activity.setup.Prefs;
import com.fsck.k9.controller.MessagingController;
import com.fsck.k9.controller.MessagingListener;
+import com.fsck.k9.helper.SizeFormatter;
import com.fsck.k9.mail.Flag;
+import com.fsck.k9.mail.ServerSettings;
+import com.fsck.k9.mail.Store;
+import com.fsck.k9.mail.Transport;
+import com.fsck.k9.mail.internet.MimeUtility;
import com.fsck.k9.mail.store.StorageManager;
+import com.fsck.k9.mail.store.WebDavStore;
import com.fsck.k9.view.ColorChip;
+import com.fsck.k9.preferences.SettingsExporter;
+import com.fsck.k9.preferences.SettingsImportExportException;
+import com.fsck.k9.preferences.SettingsImporter;
+import com.fsck.k9.preferences.SettingsImporter.AccountDescription;
+import com.fsck.k9.preferences.SettingsImporter.AccountDescriptionPair;
+import com.fsck.k9.preferences.SettingsImporter.ImportContents;
+import com.fsck.k9.preferences.SettingsImporter.ImportResults;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
public class Accounts extends K9ListActivity implements OnItemClickListener, OnClickListener {
@@ -45,9 +107,21 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
*/
private static final Flag[] EMPTY_FLAG_ARRAY = new Flag[0];
+ /**
+ * URL used to open Android Market application
+ */
+ private static final String ANDROID_MARKET_URL = "https://market.android.com/search?q=oi+file+manager&c=apps";
+
+ /**
+ * Number of special accounts ('Unified Inbox' and 'All Messages')
+ */
+ private static final int SPECIAL_ACCOUNTS_COUNT = 2;
+
private static final int DIALOG_REMOVE_ACCOUNT = 1;
private static final int DIALOG_CLEAR_ACCOUNT = 2;
private static final int DIALOG_RECREATE_ACCOUNT = 3;
+ private static final int DIALOG_NO_FILE_MANAGER = 4;
+
private ConcurrentHashMap accountStats = new ConcurrentHashMap();
private ConcurrentHashMap pendingWork = new ConcurrentHashMap();
@@ -61,6 +135,16 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
private SearchAccount integratedInboxAccount = null;
private FontSizes mFontSizes = K9.getFontSizes();
+ /**
+ * Contains information about objects that need to be retained on configuration changes.
+ *
+ * @see #onRetainNonConfigurationInstance()
+ */
+ private NonConfigurationInstance mNonConfigurationInstance;
+
+
+ private static final int ACTIVITY_REQUEST_PICK_SETTINGS_FILE = 1;
+
class AccountsHandler extends Handler {
private void setViewTitle() {
String dispString = mListener.formatHeader(Accounts.this, getString(R.string.accounts_title), mUnreadMessageCount, getTimeFormat());
@@ -131,6 +215,10 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
}
}
+ public void setProgress(boolean progress) {
+ mHandler.progress(progress);
+ }
+
ActivityListener mListener = new ActivityListener() {
@Override
public void informUserOfStatus() {
@@ -229,49 +317,81 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
context.startActivity(intent);
}
+ @Override
+ public void onNewIntent(Intent intent) {
+ Uri uri = intent.getData();
+ Log.i(K9.LOG_TAG, "Accounts Activity got uri " + uri);
+ if (uri != null) {
+ ContentResolver contentResolver = getContentResolver();
+
+ Log.i(K9.LOG_TAG, "Accounts Activity got content of type " + contentResolver.getType(uri));
+
+ String contentType = contentResolver.getType(uri);
+ if (MimeUtility.K9_SETTINGS_MIME_TYPE.equals(contentType)) {
+ onImport(uri);
+ }
+ }
+ }
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
if (!K9.isHideSpecialAccounts()) {
- unreadAccount = new SearchAccount(this, false, null, null);
- unreadAccount.setDescription(getString(R.string.search_all_messages_title));
- unreadAccount.setEmail(getString(R.string.search_all_messages_detail));
-
- integratedInboxAccount = new SearchAccount(this, true, null, null);
- integratedInboxAccount.setDescription(getString(R.string.integrated_inbox_title));
- integratedInboxAccount.setEmail(getString(R.string.integrated_inbox_detail));
+ createSpecialAccounts();
}
Account[] accounts = Preferences.getPreferences(this).getAccounts();
Intent intent = getIntent();
+ //onNewIntent(intent);
+
boolean startup = intent.getBooleanExtra(EXTRA_STARTUP, true);
if (startup && K9.startIntegratedInbox() && !K9.isHideSpecialAccounts()) {
onOpenAccount(integratedInboxAccount);
finish();
+ return;
} else if (startup && accounts.length == 1 && onOpenAccount(accounts[0])) {
- // fall through to "else" if !onOpenAccount()
finish();
- } else {
- requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- requestWindowFeature(Window.FEATURE_PROGRESS);
-
- setContentView(R.layout.accounts);
- ListView listView = getListView();
- listView.setOnItemClickListener(this);
- listView.setItemsCanFocus(false);
- listView.setEmptyView(findViewById(R.id.empty));
- findViewById(R.id.next).setOnClickListener(this);
- registerForContextMenu(listView);
-
- if (icicle != null && icicle.containsKey(SELECTED_CONTEXT_ACCOUNT)) {
- String accountUuid = icicle.getString("selectedContextAccount");
- mSelectedContextAccount = Preferences.getPreferences(this).getAccount(accountUuid);
- }
-
- restoreAccountStats(icicle);
+ return;
}
+
+ requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+ requestWindowFeature(Window.FEATURE_PROGRESS);
+
+ setContentView(R.layout.accounts);
+ ListView listView = getListView();
+ listView.setOnItemClickListener(this);
+ listView.setItemsCanFocus(false);
+ listView.setEmptyView(findViewById(R.id.empty));
+ listView.setScrollingCacheEnabled(false);
+ findViewById(R.id.next).setOnClickListener(this);
+ registerForContextMenu(listView);
+
+ if (icicle != null && icicle.containsKey(SELECTED_CONTEXT_ACCOUNT)) {
+ String accountUuid = icicle.getString("selectedContextAccount");
+ mSelectedContextAccount = Preferences.getPreferences(this).getAccount(accountUuid);
+ }
+
+ restoreAccountStats(icicle);
+
+ // Handle activity restarts because of a configuration change (e.g. rotating the screen)
+ mNonConfigurationInstance = (NonConfigurationInstance) getLastNonConfigurationInstance();
+ if (mNonConfigurationInstance != null) {
+ mNonConfigurationInstance.restore(this);
+ }
+ }
+
+ /**
+ * Creates and initializes the special accounts ('Integrated Inbox' and 'All Messages')
+ */
+ private void createSpecialAccounts() {
+ unreadAccount = new SearchAccount(this, false, null, null);
+ unreadAccount.setDescription(getString(R.string.search_all_messages_title));
+ unreadAccount.setEmail(getString(R.string.search_all_messages_detail));
+
+ integratedInboxAccount = new SearchAccount(this, true, null, null);
+ integratedInboxAccount.setDescription(getString(R.string.integrated_inbox_title));
+ integratedInboxAccount.setEmail(getString(R.string.integrated_inbox_detail));
}
@SuppressWarnings("unchecked")
@@ -320,16 +440,51 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
super.onPause();
MessagingController.getInstance(getApplication()).removeListener(mListener);
StorageManager.getInstance(getApplication()).removeListener(storageListener);
-
}
+ /**
+ * Save the reference to a currently displayed dialog or a running AsyncTask (if available).
+ */
+ @Override
+ public Object onRetainNonConfigurationInstance() {
+ Object retain = null;
+ if (mNonConfigurationInstance != null && mNonConfigurationInstance.retain()) {
+ retain = mNonConfigurationInstance;
+ }
+ return retain;
+ }
+
+ private BaseAccount[] accounts = new BaseAccount[0];
+ private enum ACCOUNT_LOCATION {
+ TOP, MIDDLE, BOTTOM;
+ }
+ private EnumSet accountLocation(BaseAccount account) {
+ EnumSet accountLocation = EnumSet.of(ACCOUNT_LOCATION.MIDDLE);
+ if (accounts.length > 0) {
+ if (accounts[0].equals(account)) {
+ accountLocation.remove(ACCOUNT_LOCATION.MIDDLE);
+ accountLocation.add(ACCOUNT_LOCATION.TOP);
+ }
+ if (accounts[accounts.length - 1].equals(account)) {
+ accountLocation.remove(ACCOUNT_LOCATION.MIDDLE);
+ accountLocation.add(ACCOUNT_LOCATION.BOTTOM);
+ }
+ }
+ return accountLocation;
+ }
+
+
private void refresh() {
- BaseAccount[] accounts = Preferences.getPreferences(this).getAccounts();
+ accounts = Preferences.getPreferences(this).getAccounts();
List newAccounts;
- if (!K9.isHideSpecialAccounts()
- && accounts.length > 0) {
- newAccounts = new ArrayList(accounts.length + 2);
+ if (!K9.isHideSpecialAccounts() && accounts.length > 0) {
+ if (integratedInboxAccount == null || unreadAccount == null) {
+ createSpecialAccounts();
+ }
+
+ newAccounts = new ArrayList(accounts.length +
+ SPECIAL_ACCOUNTS_COUNT);
newAccounts.add(integratedInboxAccount);
newAccounts.add(unreadAccount);
} else {
@@ -340,7 +495,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
mAdapter = new AccountsAdapter(newAccounts.toArray(EMPTY_BASE_ACCOUNT_ARRAY));
getListView().setAdapter(mAdapter);
- if (newAccounts.size() > 0) {
+ if (!newAccounts.isEmpty()) {
mHandler.progress(Window.PROGRESS_START);
}
pendingWork.clear();
@@ -424,7 +579,10 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
MessageList.actionHandle(this, searchAccount.getDescription(), searchAccount);
} else {
Account realAccount = (Account)account;
- if (!realAccount.isAvailable(this)) {
+ if (!realAccount.isEnabled()) {
+ onActivateAccount(realAccount);
+ return false;
+ } else if (!realAccount.isAvailable(this)) {
String toastText = getString(R.string.account_unavailable, account.getDescription());
Toast toast = Toast.makeText(getApplication(), toastText, Toast.LENGTH_SHORT);
toast.show();
@@ -441,6 +599,319 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
return true;
}
+ private void onActivateAccount(Account account) {
+ List disabledAccounts = new ArrayList();
+ disabledAccounts.add(account);
+ promptForServerPasswords(disabledAccounts);
+ }
+
+ /**
+ * Ask the user to enter the server passwords for disabled accounts.
+ *
+ * @param disabledAccounts
+ * A non-empty list of {@link Account}s to ask the user for passwords. Never
+ * {@code null}.
+ *
Note: Calling this method will modify the supplied list.
+ */
+ private void promptForServerPasswords(final List disabledAccounts) {
+ Account account = disabledAccounts.remove(0);
+ PasswordPromptDialog dialog = new PasswordPromptDialog(account, disabledAccounts);
+ setNonConfigurationInstance(dialog);
+ dialog.show(this);
+ }
+
+ /**
+ * Ask the user for the incoming/outgoing server passwords.
+ */
+ private static class PasswordPromptDialog implements NonConfigurationInstance, TextWatcher {
+ private AlertDialog mDialog;
+ private EditText mIncomingPasswordView;
+ private EditText mOutgoingPasswordView;
+ private CheckBox mUseIncomingView;
+
+ private Account mAccount;
+ private List mRemainingAccounts;
+ private String mIncomingPassword;
+ private String mOutgoingPassword;
+ private boolean mUseIncoming;
+
+ /**
+ * Constructor
+ *
+ * @param account
+ * The {@link Account} to ask the server passwords for. Never {@code null}.
+ * @param accounts
+ * The (possibly empty) list of remaining accounts to ask passwords for. Never
+ * {@code null}.
+ */
+ PasswordPromptDialog(Account account, List accounts) {
+ mAccount = account;
+ mRemainingAccounts = accounts;
+ }
+
+ @Override
+ public void restore(Activity activity) {
+ show((Accounts) activity, true);
+ }
+
+ @Override
+ public boolean retain() {
+ if (mDialog != null) {
+ // Retain entered passwords and checkbox state
+ mIncomingPassword = mIncomingPasswordView.getText().toString();
+ if (mOutgoingPasswordView != null) {
+ mOutgoingPassword = mOutgoingPasswordView.getText().toString();
+ mUseIncoming = mUseIncomingView.isChecked();
+ }
+
+ // Dismiss dialog
+ mDialog.dismiss();
+
+ // Clear all references to UI objects
+ mDialog = null;
+ mIncomingPasswordView = null;
+ mOutgoingPasswordView = null;
+ mUseIncomingView = null;
+ return true;
+ }
+ return false;
+ }
+
+ public void show(Accounts activity) {
+ show(activity, false);
+ }
+
+ private void show(final Accounts activity, boolean restore) {
+ ServerSettings incoming = Store.decodeStoreUri(mAccount.getStoreUri());
+ ServerSettings outgoing = Transport.decodeTransportUri(mAccount.getTransportUri());
+
+ // Don't ask for the password to the outgoing server for WebDAV accounts, because
+ // incoming and outgoing servers are identical for this account type.
+ boolean configureOutgoingServer = !WebDavStore.STORE_TYPE.equals(outgoing.type);
+
+ // Create a ScrollView that will be used as container for the whole layout
+ final ScrollView scrollView = new ScrollView(activity);
+
+ // Create the dialog
+ final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ builder.setTitle(activity.getString(R.string.settings_import_activate_account_header));
+ builder.setView(scrollView);
+ builder.setPositiveButton(activity.getString(R.string.okay_action),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ String incomingPassword = mIncomingPasswordView.getText().toString();
+ String outgoingPassword = null;
+ if (mOutgoingPasswordView != null) {
+ outgoingPassword = (mUseIncomingView.isChecked()) ?
+ incomingPassword : mOutgoingPasswordView.getText().toString();
+ }
+
+ dialog.dismiss();
+
+ // Set the server passwords in the background
+ SetPasswordsAsyncTask asyncTask = new SetPasswordsAsyncTask(activity, mAccount,
+ incomingPassword, outgoingPassword, mRemainingAccounts);
+ activity.setNonConfigurationInstance(asyncTask);
+ asyncTask.execute();
+ }
+ });
+ builder.setNegativeButton(activity.getString(R.string.cancel_action),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ activity.setNonConfigurationInstance(null);
+ }
+ });
+ mDialog = builder.create();
+
+ // Use the dialog's layout inflater so its theme is used (and not the activity's theme).
+ View layout = mDialog.getLayoutInflater().inflate(
+ R.layout.accounts_password_prompt, null);
+
+ // Set the intro text that tells the user what to do
+ TextView intro = (TextView) layout.findViewById(R.id.password_prompt_intro);
+ String serverPasswords = activity.getResources().getQuantityString(
+ R.plurals.settings_import_server_passwords,
+ (configureOutgoingServer) ? 2 : 1);
+ intro.setText(activity.getString(R.string.settings_import_activate_account_intro,
+ mAccount.getDescription(), serverPasswords));
+
+ // Display the hostname of the incoming server
+ TextView incomingText = (TextView) layout.findViewById(
+ R.id.password_prompt_incoming_server);
+ incomingText.setText(activity.getString(R.string.settings_import_incoming_server,
+ incoming.host));
+
+ mIncomingPasswordView = (EditText) layout.findViewById(R.id.incoming_server_password);
+ mIncomingPasswordView.addTextChangedListener(this);
+
+ if (configureOutgoingServer) {
+ // Display the hostname of the outgoing server
+ TextView outgoingText = (TextView) layout.findViewById(
+ R.id.password_prompt_outgoing_server);
+ outgoingText.setText(activity.getString(R.string.settings_import_outgoing_server,
+ outgoing.host));
+
+ mOutgoingPasswordView = (EditText) layout.findViewById(
+ R.id.outgoing_server_password);
+ mOutgoingPasswordView.addTextChangedListener(this);
+
+ mUseIncomingView = (CheckBox) layout.findViewById(
+ R.id.use_incoming_server_password);
+ mUseIncomingView.setChecked(true);
+ mUseIncomingView.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ mOutgoingPasswordView.setText(null);
+ mOutgoingPasswordView.setEnabled(false);
+ } else {
+ mOutgoingPasswordView.setText(mIncomingPasswordView.getText());
+ mOutgoingPasswordView.setEnabled(true);
+ }
+ }
+ });
+ } else {
+ layout.findViewById(R.id.outgoing_server_prompt).setVisibility(View.GONE);
+ }
+
+ // Add the layout to the ScrollView
+ scrollView.addView(layout);
+
+ // Show the dialog
+ mDialog.show();
+
+ // Restore the contents of the password boxes and the checkbox (if the dialog was
+ // retained during a configuration change).
+ if (restore) {
+ mIncomingPasswordView.setText(mIncomingPassword);
+ if (configureOutgoingServer) {
+ mOutgoingPasswordView.setText(mOutgoingPassword);
+ mUseIncomingView.setChecked(mUseIncoming);
+ }
+ } else {
+ // Trigger afterTextChanged() being called
+ // Work around this bug: https://code.google.com/p/android/issues/detail?id=6360
+ mIncomingPasswordView.setText(mIncomingPasswordView.getText());
+ }
+ }
+
+ @Override
+ public void afterTextChanged(Editable arg0) {
+ boolean enable = false;
+ // Is the password box for the incoming server password empty?
+ if (mIncomingPasswordView.getText().length() > 0) {
+ // Do we need to check the outgoing server password box?
+ if (mOutgoingPasswordView == null) {
+ enable = true;
+ }
+ // If the checkbox to use the incoming server password is checked we need to make
+ // sure that the password box for the outgoing server isn't empty.
+ else if (mUseIncomingView.isChecked() ||
+ mOutgoingPasswordView.getText().length() > 0) {
+ enable = true;
+ }
+ }
+
+ // Disable "OK" button if the user hasn't specified all necessary passwords.
+ mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(enable);
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ // Not used
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ // Not used
+ }
+ }
+
+ /**
+ * Set the incoming/outgoing server password in the background.
+ */
+ private static class SetPasswordsAsyncTask extends ExtendedAsyncTask {
+ private Account mAccount;
+ private String mIncomingPassword;
+ private String mOutgoingPassword;
+ private List mRemainingAccounts;
+ private Application mApplication;
+
+ protected SetPasswordsAsyncTask(Activity activity, Account account,
+ String incomingPassword, String outgoingPassword,
+ List remainingAccounts) {
+ super(activity);
+ mAccount = account;
+ mIncomingPassword = incomingPassword;
+ mOutgoingPassword = outgoingPassword;
+ mRemainingAccounts = remainingAccounts;
+ mApplication = mActivity.getApplication();
+ }
+
+ @Override
+ protected void showProgressDialog() {
+ String title = mActivity.getString(R.string.settings_import_activate_account_header);
+ int passwordCount = (mOutgoingPassword == null) ? 1 : 2;
+ String message = mActivity.getResources().getQuantityString(
+ R.plurals.settings_import_setting_passwords, passwordCount);
+ mProgressDialog = ProgressDialog.show(mActivity, title, message, true);
+ }
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ try {
+ // Set incoming server password
+ String storeUri = mAccount.getStoreUri();
+ ServerSettings incoming = Store.decodeStoreUri(storeUri);
+ ServerSettings newIncoming = incoming.newPassword(mIncomingPassword);
+ String newStoreUri = Store.createStoreUri(newIncoming);
+ mAccount.setStoreUri(newStoreUri);
+
+ if (mOutgoingPassword != null) {
+ // Set outgoing server password
+ String transportUri = mAccount.getTransportUri();
+ ServerSettings outgoing = Transport.decodeTransportUri(transportUri);
+ ServerSettings newOutgoing = outgoing.newPassword(mOutgoingPassword);
+ String newTransportUri = Transport.createTransportUri(newOutgoing);
+ mAccount.setTransportUri(newTransportUri);
+ }
+
+ // Mark account as enabled
+ mAccount.setEnabled(true);
+
+ // Save the account settings
+ mAccount.save(Preferences.getPreferences(mContext));
+
+ // Start services if necessary
+ K9.setServicesEnabled(mContext);
+
+ // Get list of folders from remote server
+ MessagingController.getInstance(mApplication).listFolders(mAccount, true, null);
+ } catch (Exception e) {
+ Log.e(K9.LOG_TAG, "Something went while setting account passwords", e);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ Accounts activity = (Accounts) mActivity;
+
+ // Let the activity know that the background task is complete
+ activity.setNonConfigurationInstance(null);
+
+ activity.refresh();
+ removeProgressDialog();
+
+ if (mRemainingAccounts.size() > 0) {
+ activity.promptForServerPasswords(mRemainingAccounts);
+ }
+ }
+ }
+
public void onClick(View view) {
if (view.getId() == R.id.next) {
onAddNewAccount();
@@ -517,6 +988,20 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
}
}
});
+ case DIALOG_NO_FILE_MANAGER:
+ return ConfirmationDialog.create(this, id,
+ R.string.import_dialog_error_title,
+ getString(R.string.import_dialog_error_message),
+ R.string.open_market,
+ R.string.close,
+ new Runnable() {
+ @Override
+ public void run() {
+ Uri uri = Uri.parse(ANDROID_MARKET_URL);
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ startActivity(intent);
+ }
+ });
}
return super.onCreateDialog(id);
}
@@ -538,6 +1023,9 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
alert.setMessage(getString(R.string.account_recreate_dlg_instructions_fmt,
mSelectedContextAccount.getDescription()));
break;
+ case DIALOG_NO_FILE_MANAGER:
+ alert.setMessage(getString(R.string.import_dialog_error_message));
+ break;
}
super.onPrepareDialog(id, d);
@@ -565,6 +1053,9 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
case R.id.open:
onOpenAccount(mSelectedContextAccount);
break;
+ case R.id.activate:
+ onActivateAccount(realAccount);
+ break;
case R.id.check_mail:
onCheckMail(realAccount);
break;
@@ -583,6 +1074,15 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
case R.id.recreate:
onRecreate(realAccount);
break;
+ case R.id.export:
+ onExport(false, realAccount);
+ break;
+ case R.id.move_up:
+ onMove(realAccount, true);
+ break;
+ case R.id.move_down:
+ onMove(realAccount, false);
+ break;
}
return true;
}
@@ -601,7 +1101,11 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
private void onRecreate(Account account) {
showDialog(DIALOG_RECREATE_ACCOUNT);
}
-
+ private void onMove(final Account account, final boolean up) {
+ MoveAccountAsyncTask asyncTask = new MoveAccountAsyncTask(this, account, up);
+ setNonConfigurationInstance(asyncTask);
+ asyncTask.execute();
+ }
public void onItemClick(AdapterView> parent, View view, int position, long id) {
BaseAccount account = (BaseAccount)parent.getItemAtPosition(position);
@@ -629,6 +1133,12 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
case R.id.search:
onSearchRequested();
break;
+ case R.id.export_all:
+ onExport(true, null);
+ break;
+ case R.id.import_settings:
+ onImport();
+ break;
default:
return super.onOptionsItemSelected(item);
}
@@ -640,6 +1150,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
new String[] {"JZlib", "http://www.jcraft.com/jzlib/"},
new String[] {"Commons IO", "http://commons.apache.org/io/"},
new String[] {"Mime4j", "http://james.apache.org/mime4j/"},
+ new String[] {"HtmlCleaner", "http://htmlcleaner.sourceforge.net/"},
};
private void onAbout() {
@@ -674,7 +1185,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
StringBuilder libs = new StringBuilder().append("
");
for (String[] library : USED_LIBRARIES) {
- libs.append("
")
+ .append(getString(R.string.app_htmlcleaner_license));
+
wv.loadDataWithBaseURL("file:///android_res/drawable/", html.toString(), "text/html", "utf-8", null);
new AlertDialog.Builder(this)
@@ -729,10 +1242,16 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle(R.string.accounts_context_menu_title);
- getMenuInflater().inflate(R.menu.accounts_context, menu);
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
BaseAccount account = mAdapter.getItem(info.position);
+
+ if ((account instanceof Account) && !((Account) account).isEnabled()) {
+ getMenuInflater().inflate(R.menu.disabled_accounts_context, menu);
+ } else {
+ getMenuInflater().inflate(R.menu.accounts_context, menu);
+ }
+
if (account instanceof SearchAccount) {
for (int i = 0; i < menu.size(); i++) {
MenuItem item = menu.getItem(i);
@@ -741,6 +1260,345 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
}
}
}
+ else {
+ EnumSet accountLocation = accountLocation(account);
+ if (accountLocation.contains(ACCOUNT_LOCATION.TOP)) {
+ menu.findItem(R.id.move_up).setEnabled(false);
+ }
+ else {
+ menu.findItem(R.id.move_up).setEnabled(true);
+ }
+ if (accountLocation.contains(ACCOUNT_LOCATION.BOTTOM)) {
+ menu.findItem(R.id.move_down).setEnabled(false);
+ }
+ else {
+ menu.findItem(R.id.move_down).setEnabled(true);
+ }
+ }
+ }
+
+ private void onImport() {
+ Intent i = new Intent(Intent.ACTION_GET_CONTENT);
+ i.addCategory(Intent.CATEGORY_OPENABLE);
+ i.setType(MimeUtility.K9_SETTINGS_MIME_TYPE);
+
+ PackageManager packageManager = getPackageManager();
+ List infos = packageManager.queryIntentActivities(i, 0);
+
+ if (infos.size() > 0) {
+ startActivityForResult(Intent.createChooser(i, null),
+ ACTIVITY_REQUEST_PICK_SETTINGS_FILE);
+ } else {
+ showDialog(DIALOG_NO_FILE_MANAGER);
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ Log.i(K9.LOG_TAG, "onActivityResult requestCode = " + requestCode + ", resultCode = " + resultCode + ", data = " + data);
+ if (resultCode != RESULT_OK)
+ return;
+ if (data == null) {
+ return;
+ }
+ switch (requestCode) {
+ case ACTIVITY_REQUEST_PICK_SETTINGS_FILE:
+ onImport(data.getData());
+ break;
+ }
+ }
+
+ private void onImport(Uri uri) {
+ ListImportContentsAsyncTask asyncTask = new ListImportContentsAsyncTask(this, uri);
+ setNonConfigurationInstance(asyncTask);
+ asyncTask.execute();
+ }
+
+
+ private void showSimpleDialog(int headerRes, int messageRes, Object... args) {
+ SimpleDialog dialog = new SimpleDialog(headerRes, messageRes, args);
+ dialog.show(this);
+ setNonConfigurationInstance(dialog);
+ }
+
+ /**
+ * A simple dialog.
+ */
+ private static class SimpleDialog implements NonConfigurationInstance {
+ private final int mHeaderRes;
+ private final int mMessageRes;
+ private Object[] mArguments;
+ private Dialog mDialog;
+
+ SimpleDialog(int headerRes, int messageRes, Object... args) {
+ this.mHeaderRes = headerRes;
+ this.mMessageRes = messageRes;
+ this.mArguments = args;
+ }
+
+ @Override
+ public void restore(Activity activity) {
+ show((Accounts) activity);
+ }
+
+ @Override
+ public boolean retain() {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ mDialog = null;
+ return true;
+ }
+ return false;
+ }
+
+ public void show(final Accounts activity) {
+ final String message = generateMessage(activity);
+
+ final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ builder.setTitle(mHeaderRes);
+ builder.setMessage(message);
+ builder.setPositiveButton(R.string.okay_action,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ activity.setNonConfigurationInstance(null);
+ okayAction(activity);
+ }
+ });
+ mDialog = builder.show();
+ }
+
+ /**
+ * Returns the message the dialog should display.
+ *
+ * @param activity
+ * The {@code Activity} this dialog belongs to.
+ *
+ * @return The message the dialog should display
+ */
+ protected String generateMessage(Accounts activity) {
+ return activity.getString(mMessageRes, mArguments);
+ }
+
+ /**
+ * This method is called after the "OK" button was pressed.
+ *
+ * @param activity
+ * The {@code Activity} this dialog belongs to.
+ */
+ protected void okayAction(Accounts activity) {
+ // Do nothing
+ }
+ }
+
+ /**
+ * Shows a dialog that displays how many accounts were successfully imported.
+ *
+ * @param importResults
+ * The {@link ImportResults} instance returned by the {@link SettingsImporter}.
+ * @param filename
+ * The name of the settings file that was imported.
+ */
+ private void showAccountsImportedDialog(ImportResults importResults, String filename) {
+ AccountsImportedDialog dialog = new AccountsImportedDialog(importResults, filename);
+ dialog.show(this);
+ setNonConfigurationInstance(dialog);
+ }
+
+ /**
+ * A dialog that displays how many accounts were successfully imported.
+ */
+ private static class AccountsImportedDialog extends SimpleDialog {
+ private ImportResults mImportResults;
+ private String mFilename;
+
+ AccountsImportedDialog(ImportResults importResults, String filename) {
+ super(R.string.settings_import_success_header, R.string.settings_import_success);
+ mImportResults = importResults;
+ mFilename = filename;
+ }
+
+ @Override
+ protected String generateMessage(Accounts activity) {
+ //TODO: display names of imported accounts (name from file *and* possibly new name)
+
+ int imported = mImportResults.importedAccounts.size();
+ String accounts = activity.getResources().getQuantityString(
+ R.plurals.settings_import_success, imported, imported);
+ return activity.getString(R.string.settings_import_success, accounts, mFilename);
+ }
+
+ @Override
+ protected void okayAction(Accounts activity) {
+ Context context = activity.getApplicationContext();
+ Preferences preferences = Preferences.getPreferences(context);
+ List disabledAccounts = new ArrayList();
+ for (AccountDescriptionPair accountPair : mImportResults.importedAccounts) {
+ Account account = preferences.getAccount(accountPair.imported.uuid);
+ if (account != null && !account.isEnabled()) {
+ disabledAccounts.add(account);
+ }
+ }
+ if (disabledAccounts.size() > 0) {
+ activity.promptForServerPasswords(disabledAccounts);
+ } else {
+ activity.setNonConfigurationInstance(null);
+ }
+ }
+ }
+
+ /**
+ * Display a dialog that lets the user select which accounts to import from the settings file.
+ *
+ * @param importContents
+ * The {@link ImportContents} instance returned by
+ * {@link SettingsImporter#getImportStreamContents(InputStream)}
+ * @param uri
+ * The (content) URI of the settings file.
+ */
+ private void showImportSelectionDialog(ImportContents importContents, Uri uri) {
+ ImportSelectionDialog dialog = new ImportSelectionDialog(importContents, uri);
+ dialog.show(this);
+ setNonConfigurationInstance(dialog);
+ }
+
+ /**
+ * A dialog that lets the user select which accounts to import from the settings file.
+ */
+ private static class ImportSelectionDialog implements NonConfigurationInstance {
+ private ImportContents mImportContents;
+ private Uri mUri;
+ private Dialog mDialog;
+ private ListView mImportSelectionView;
+ private SparseBooleanArray mSelection;
+
+
+ ImportSelectionDialog(ImportContents importContents, Uri uri) {
+ mImportContents = importContents;
+ mUri = uri;
+ }
+
+ @Override
+ public void restore(Activity activity) {
+ show((Accounts) activity, mSelection);
+ }
+
+ @Override
+ public boolean retain() {
+ if (mDialog != null) {
+ // Save the selection state of each list item
+ mSelection = mImportSelectionView.getCheckedItemPositions();
+ mImportSelectionView = null;
+
+ mDialog.dismiss();
+ mDialog = null;
+ return true;
+ }
+ return false;
+ }
+
+ public void show(Accounts activity) {
+ show(activity, null);
+ }
+
+ public void show(final Accounts activity, SparseBooleanArray selection) {
+ final ListView importSelectionView = new ListView(activity);
+ mImportSelectionView = importSelectionView;
+ List contents = new ArrayList();
+
+ if (mImportContents.globalSettings) {
+ contents.add(activity.getString(R.string.settings_import_global_settings));
+ }
+
+ for (AccountDescription account : mImportContents.accounts) {
+ contents.add(account.name);
+ }
+
+ importSelectionView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+ importSelectionView.setAdapter(new ArrayAdapter(activity,
+ android.R.layout.simple_list_item_checked, contents));
+ importSelectionView.setOnItemSelectedListener(new OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView> parent, View view, int pos, long id) {
+ CheckedTextView ctv = (CheckedTextView)view;
+ ctv.setChecked(!ctv.isChecked());
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView> arg0) { /* Do nothing */ }
+ });
+
+ if (selection != null) {
+ for (int i = 0, end = contents.size(); i < end; i++) {
+ importSelectionView.setItemChecked(i, selection.get(i));
+ }
+ }
+
+ //TODO: listview header: "Please select the settings you wish to import"
+ //TODO: listview footer: "Select all" / "Select none" buttons?
+ //TODO: listview footer: "Overwrite existing accounts?" checkbox
+
+ final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ builder.setTitle(activity.getString(R.string.settings_import_selection));
+ builder.setView(importSelectionView);
+ builder.setInverseBackgroundForced(true);
+ builder.setPositiveButton(R.string.okay_action,
+ new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ ListAdapter adapter = importSelectionView.getAdapter();
+ int count = adapter.getCount();
+ SparseBooleanArray pos = importSelectionView.getCheckedItemPositions();
+
+ boolean includeGlobals = mImportContents.globalSettings ? pos.get(0) : false;
+ List accountUuids = new ArrayList();
+ int start = mImportContents.globalSettings ? 1 : 0;
+ for (int i = start; i < count; i++) {
+ if (pos.get(i)) {
+ accountUuids.add(mImportContents.accounts.get(i-start).uuid);
+ }
+ }
+
+ /*
+ * TODO: Think some more about this. Overwriting could change the store
+ * type. This requires some additional code in order to work smoothly
+ * while the app is running.
+ */
+ boolean overwrite = false;
+
+ dialog.dismiss();
+ activity.setNonConfigurationInstance(null);
+
+ ImportAsyncTask importAsyncTask = new ImportAsyncTask(activity,
+ includeGlobals, accountUuids, overwrite, mUri);
+ activity.setNonConfigurationInstance(importAsyncTask);
+ importAsyncTask.execute();
+ }
+ });
+ builder.setNegativeButton(R.string.cancel_action,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ activity.setNonConfigurationInstance(null);
+ }
+ });
+ mDialog = builder.show();
+ }
+ }
+
+ /**
+ * Set the {@code NonConfigurationInstance} this activity should retain on configuration
+ * changes.
+ *
+ * @param inst
+ * The {@link NonConfigurationInstance} that should be retained when
+ * {@link Accounts#onRetainNonConfigurationInstance()} is called.
+ */
+ private void setNonConfigurationInstance(NonConfigurationInstance inst) {
+ mNonConfigurationInstance = inst;
}
class AccountsAdapter extends ArrayAdapter {
@@ -837,8 +1695,8 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
}
- holder.description.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getAccountName());
- holder.email.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getAccountDescription());
+ holder.description.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getAccountName());
+ holder.email.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getAccountDescription());
if (K9.useCompactLayouts()) {
holder.accountsItemLayout.setMinimumHeight(0);
@@ -940,4 +1798,246 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
}
+ public void onExport(final boolean includeGlobals, final Account account) {
+
+ // TODO, prompt to allow a user to choose which accounts to export
+ Set accountUuids = null;
+ if (account != null) {
+ accountUuids = new HashSet();
+ accountUuids.add(account.getUuid());
+ }
+
+ ExportAsyncTask asyncTask = new ExportAsyncTask(this, includeGlobals, accountUuids);
+ setNonConfigurationInstance(asyncTask);
+ asyncTask.execute();
+ }
+
+ /**
+ * Handles exporting of global settings and/or accounts in a background thread.
+ */
+ private static class ExportAsyncTask extends ExtendedAsyncTask {
+ private boolean mIncludeGlobals;
+ private Set mAccountUuids;
+ private String mFileName;
+
+
+ private ExportAsyncTask(Accounts activity, boolean includeGlobals,
+ Set accountUuids) {
+ super(activity);
+ mIncludeGlobals = includeGlobals;
+ mAccountUuids = accountUuids;
+ }
+
+ @Override
+ protected void showProgressDialog() {
+ String title = mContext.getString(R.string.settings_export_dialog_title);
+ String message = mContext.getString(R.string.settings_exporting);
+ mProgressDialog = ProgressDialog.show(mActivity, title, message, true);
+ }
+
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ try {
+ mFileName = SettingsExporter.exportToFile(mContext, mIncludeGlobals,
+ mAccountUuids);
+ } catch (SettingsImportExportException e) {
+ Log.w(K9.LOG_TAG, "Exception during export", e);
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ protected void onPostExecute(Boolean success) {
+ Accounts activity = (Accounts) mActivity;
+
+ // Let the activity know that the background task is complete
+ activity.setNonConfigurationInstance(null);
+
+ removeProgressDialog();
+
+ if (success) {
+ activity.showSimpleDialog(R.string.settings_export_success_header,
+ R.string.settings_export_success, mFileName);
+ } else {
+ //TODO: better error messages
+ activity.showSimpleDialog(R.string.settings_export_failed_header,
+ R.string.settings_export_failure);
+ }
+ }
+ }
+
+ /**
+ * Handles importing of global settings and/or accounts in a background thread.
+ */
+ private static class ImportAsyncTask extends ExtendedAsyncTask {
+ private boolean mIncludeGlobals;
+ private List mAccountUuids;
+ private boolean mOverwrite;
+ private Uri mUri;
+ private ImportResults mImportResults;
+
+ private ImportAsyncTask(Accounts activity, boolean includeGlobals,
+ List accountUuids, boolean overwrite, Uri uri) {
+ super(activity);
+ mIncludeGlobals = includeGlobals;
+ mAccountUuids = accountUuids;
+ mOverwrite = overwrite;
+ mUri = uri;
+ }
+
+ @Override
+ protected void showProgressDialog() {
+ String title = mContext.getString(R.string.settings_import_dialog_title);
+ String message = mContext.getString(R.string.settings_importing);
+ mProgressDialog = ProgressDialog.show(mActivity, title, message, true);
+ }
+
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ try {
+ InputStream is = mContext.getContentResolver().openInputStream(mUri);
+ try {
+ mImportResults = SettingsImporter.importSettings(mContext, is,
+ mIncludeGlobals, mAccountUuids, mOverwrite);
+ } finally {
+ try {
+ is.close();
+ } catch (IOException e) { /* Ignore */ }
+ }
+ } catch (SettingsImportExportException e) {
+ Log.w(K9.LOG_TAG, "Exception during import", e);
+ return false;
+ } catch (FileNotFoundException e) {
+ Log.w(K9.LOG_TAG, "Couldn't open import file", e);
+ return false;
+ } catch (Exception e) {
+ Log.w(K9.LOG_TAG, "Unknown error", e);
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ protected void onPostExecute(Boolean success) {
+ Accounts activity = (Accounts) mActivity;
+
+ // Let the activity know that the background task is complete
+ activity.setNonConfigurationInstance(null);
+
+ removeProgressDialog();
+
+ String filename = mUri.getLastPathSegment();
+ boolean globalSettings = mImportResults.globalSettings;
+ int imported = mImportResults.importedAccounts.size();
+ if (success && (globalSettings || imported > 0)) {
+ if (imported == 0) {
+ activity.showSimpleDialog(R.string.settings_import_success_header,
+ R.string.settings_import_global_settings_success, filename);
+ } else {
+ activity.showAccountsImportedDialog(mImportResults, filename);
+ }
+
+ activity.refresh();
+ } else {
+ //TODO: better error messages
+ activity.showSimpleDialog(R.string.settings_import_failed_header,
+ R.string.settings_import_failure, filename);
+ }
+ }
+ }
+
+ private static class ListImportContentsAsyncTask extends ExtendedAsyncTask {
+ private Uri mUri;
+ private ImportContents mImportContents;
+
+ private ListImportContentsAsyncTask(Accounts activity, Uri uri) {
+ super(activity);
+
+ mUri = uri;
+ }
+
+ @Override
+ protected void showProgressDialog() {
+ String title = mContext.getString(R.string.settings_import_dialog_title);
+ String message = mContext.getString(R.string.settings_import_scanning_file);
+ mProgressDialog = ProgressDialog.show(mActivity, title, message, true);
+ }
+
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ try {
+ ContentResolver resolver = mContext.getContentResolver();
+ InputStream is = resolver.openInputStream(mUri);
+ try {
+ mImportContents = SettingsImporter.getImportStreamContents(is);
+ } finally {
+ try {
+ is.close();
+ } catch (IOException e) { /* Ignore */ }
+ }
+ } catch (SettingsImportExportException e) {
+ Log.w(K9.LOG_TAG, "Exception during export", e);
+ return false;
+ }
+ catch (FileNotFoundException e) {
+ Log.w(K9.LOG_TAG, "Couldn't read content from URI " + mUri);
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ protected void onPostExecute(Boolean success) {
+ Accounts activity = (Accounts) mActivity;
+
+ // Let the activity know that the background task is complete
+ activity.setNonConfigurationInstance(null);
+
+ removeProgressDialog();
+
+ if (success) {
+ activity.showImportSelectionDialog(mImportContents, mUri);
+ } else {
+ String filename = mUri.getLastPathSegment();
+ //TODO: better error messages
+ activity.showSimpleDialog(R.string.settings_import_failed_header,
+ R.string.settings_import_failure, filename);
+ }
+ }
+ }
+
+ private static class MoveAccountAsyncTask extends ExtendedAsyncTask {
+ private Account mAccount;
+ private boolean mUp;
+
+ protected MoveAccountAsyncTask(Activity activity, Account account, boolean up) {
+ super(activity);
+ mAccount = account;
+ mUp = up;
+ }
+
+ @Override
+ protected void showProgressDialog() {
+ String message = mActivity.getString(R.string.manage_accounts_moving_message);
+ mProgressDialog = ProgressDialog.show(mActivity, null, message, true);
+ }
+
+ @Override
+ protected Void doInBackground(Void... args) {
+ mAccount.move(Preferences.getPreferences(mContext), mUp);
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void arg) {
+ Accounts activity = (Accounts) mActivity;
+
+ // Let the activity know that the background task is complete
+ activity.setNonConfigurationInstance(null);
+
+ activity.refresh();
+ removeProgressDialog();
+ }
+ }
}
diff --git a/src/com/fsck/k9/activity/ChooseAccount.java b/src/com/fsck/k9/activity/ChooseAccount.java
index 6b04f6b76..df2d47932 100644
--- a/src/com/fsck/k9/activity/ChooseAccount.java
+++ b/src/com/fsck/k9/activity/ChooseAccount.java
@@ -28,6 +28,7 @@ import java.util.List;
* @see K9ExpandableListActivity
*/
public class ChooseAccount extends K9ExpandableListActivity {
+ private static final Account[] EMPTY_ACCOUNT_ARRAY = new Account[0];
/**
* {@link Intent} extended data name for storing {@link Account#getUuid()
@@ -50,7 +51,7 @@ public class ChooseAccount extends K9ExpandableListActivity {
final ExpandableListView expandableListView = getExpandableListView();
expandableListView.setItemsCanFocus(false);
- final ExpandableListAdapter adapter = createAdapter();
+ final IdentitiesAdapter adapter = createAdapter();
setListAdapter(adapter);
expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@@ -77,7 +78,7 @@ public class ChooseAccount extends K9ExpandableListActivity {
final Bundle extras = getIntent().getExtras();
final String uuid = extras.getString(EXTRA_ACCOUNT);
if (uuid != null) {
- final Account[] accounts = Preferences.getPreferences(this).getAccounts();
+ final Account[] accounts = adapter.getAccounts();
final int length = accounts.length;
for (int i = 0; i < length; i++) {
final Account account = accounts[i];
@@ -106,7 +107,7 @@ public class ChooseAccount extends K9ExpandableListActivity {
}
}
- private ExpandableListAdapter createAdapter() {
+ private IdentitiesAdapter createAdapter() {
return new IdentitiesAdapter(this, getLayoutInflater());
}
@@ -123,10 +124,13 @@ public class ChooseAccount extends K9ExpandableListActivity {
private Context mContext;
private LayoutInflater mLayoutInflater;
+ private Account[] mAccounts;
public IdentitiesAdapter(final Context context, final LayoutInflater layoutInflater) {
mContext = context;
mLayoutInflater = layoutInflater;
+ Preferences prefs = Preferences.getPreferences(mContext);
+ mAccounts = prefs.getAvailableAccounts().toArray(EMPTY_ACCOUNT_ARRAY);
}
@Override
@@ -172,7 +176,7 @@ public class ChooseAccount extends K9ExpandableListActivity {
final TextView description = (TextView) v.findViewById(R.id.description);
final Account account = getAccounts()[groupPosition];
description.setText(account.getDescription());
- description.setTextSize(TypedValue.COMPLEX_UNIT_DIP, K9.getFontSizes().getAccountName());
+ description.setTextSize(TypedValue.COMPLEX_UNIT_SP, K9.getFontSizes().getAccountName());
// display unavailable accounts translucent
/*
@@ -210,8 +214,8 @@ public class ChooseAccount extends K9ExpandableListActivity {
final TextView name = (TextView) v.findViewById(R.id.name);
final TextView description = (TextView) v.findViewById(R.id.description);
- name.setTextSize(TypedValue.COMPLEX_UNIT_DIP, K9.getFontSizes().getAccountName());
- description.setTextSize(TypedValue.COMPLEX_UNIT_DIP, K9.getFontSizes().getAccountDescription());
+ name.setTextSize(TypedValue.COMPLEX_UNIT_SP, K9.getFontSizes().getAccountName());
+ description.setTextSize(TypedValue.COMPLEX_UNIT_SP, K9.getFontSizes().getAccountDescription());
name.setText(identity.getDescription());
description.setText(String.format("%s <%s>", identity.getName(), identity.getEmail()));
@@ -233,7 +237,7 @@ public class ChooseAccount extends K9ExpandableListActivity {
}
private Account[] getAccounts() {
- return Preferences.getPreferences(mContext).getAccounts();
+ return mAccounts;
}
}
}
diff --git a/src/com/fsck/k9/activity/ChooseFolder.java b/src/com/fsck/k9/activity/ChooseFolder.java
index 2003d7f7d..dc4a88115 100644
--- a/src/com/fsck/k9/activity/ChooseFolder.java
+++ b/src/com/fsck/k9/activity/ChooseFolder.java
@@ -1,9 +1,13 @@
package com.fsck.k9.activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
+import android.text.Editable;
+import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@@ -11,6 +15,7 @@ import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.EditText;
import android.widget.Filter;
import android.widget.ListView;
import android.widget.TextView;
@@ -196,11 +201,73 @@ public class ChooseFolder extends K9ListActivity {
setDisplayMode(FolderMode.ALL);
return true;
}
+
+ case R.id.list_folders: {
+ onRefresh();
+
+ return true;
+ }
+ case R.id.filter_folders: {
+ onEnterFilter();
+ }
+ return true;
default:
return super.onOptionsItemSelected(item);
}
}
+
+ private void onRefresh() {
+
+ MessagingController.getInstance(getApplication()).listFolders(mAccount, true, mListener);
+
+ }
+
+ /**
+ * Show an alert with an input-field for a filter-expression.
+ * Filter {@link #mAdapter} with the user-input.
+ */
+ private void onEnterFilter() {
+ final AlertDialog.Builder filterAlert = new AlertDialog.Builder(this);
+
+ final EditText input = new EditText(this);
+ input.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ mAdapter.getFilter().filter(input.getText().toString());
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+ });
+ input.setHint(R.string.folder_list_filter_hint);
+ filterAlert.setView(input);
+
+ filterAlert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ String value = input.getText().toString().trim();
+ mAdapter.getFilter().filter(value);
+ }
+ });
+
+ filterAlert.setNegativeButton("Cancel",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ mAdapter.getFilter().filter("");
+ }
+ });
+
+ filterAlert.show();
+
+ }
+
private void setDisplayMode(FolderMode aMode) {
mMode = aMode;
// invalidate the current filter as it is working on an inval
diff --git a/src/com/fsck/k9/activity/ConfirmationDialog.java b/src/com/fsck/k9/activity/ConfirmationDialog.java
index 73e9bf81c..246ab2f5d 100644
--- a/src/com/fsck/k9/activity/ConfirmationDialog.java
+++ b/src/com/fsck/k9/activity/ConfirmationDialog.java
@@ -22,6 +22,26 @@ public class ConfirmationDialog {
public static Dialog create(final Activity activity, final int dialogId, final int title,
final String message, final int confirmButton, final int cancelButton,
final Runnable action) {
+ return create(activity, dialogId, title, message, confirmButton, cancelButton,
+ action, null);
+ }
+
+ /**
+ * Creates a customized confirmation dialog ({@link AlertDialog}).
+ *
+ * @param activity The activity this dialog is created for.
+ * @param dialogId The id that was used with {@link Activity#showDialog(int)}
+ * @param title The resource id of the text to display in the dialog title
+ * @param message The text to display in the main dialog area
+ * @param confirmButton The resource id of the text to display in the confirm button
+ * @param cancelButton The resource id of the text to display in the cancel button
+ * @param action The action to perform if the user presses the confirm button
+ * @param negativeAction The action to perform if the user presses the cancel button. Can be {@code null}.
+ * @return A confirmation dialog with the supplied arguments
+ */
+ public static Dialog create(final Activity activity, final int dialogId, final int title,
+ final String message, final int confirmButton, final int cancelButton,
+ final Runnable action, final Runnable negativeAction) {
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(title);
@@ -39,6 +59,9 @@ public class ConfirmationDialog {
@Override
public void onClick(DialogInterface dialog, int which) {
activity.dismissDialog(dialogId);
+ if (negativeAction != null) {
+ negativeAction.run();
+ }
}
});
return builder.create();
@@ -55,13 +78,13 @@ public class ConfirmationDialog {
* @param cancelButton The resource id of the text to display in the cancel button
* @param action The action to perform if the user presses the confirm button
* @return A confirmation dialog with the supplied arguments
- * @see #create(Activity,int,int,String,int,int,Runnable)
+ * @see #create(Activity,int,int,String,int,int,Runnable, Runnable)
*/
public static Dialog create(final Activity activity, final int dialogId, final int title,
final int message, final int confirmButton, final int cancelButton,
final Runnable action) {
return create(activity, dialogId, title, activity.getString(message), confirmButton,
- cancelButton, action);
+ cancelButton, action, null);
}
}
diff --git a/src/com/fsck/k9/activity/EditIdentity.java b/src/com/fsck/k9/activity/EditIdentity.java
index 6fff570cb..bf9eeced8 100644
--- a/src/com/fsck/k9/activity/EditIdentity.java
+++ b/src/com/fsck/k9/activity/EditIdentity.java
@@ -1,7 +1,6 @@
package com.fsck.k9.activity;
import android.os.Bundle;
-import android.view.KeyEvent;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
@@ -91,11 +90,6 @@ public class EditIdentity extends K9Activity {
}
}
- @Override
- public void onResume() {
- super.onResume();
- }
-
private void saveIdentity() {
mIdentity.setDescription(mDescriptionView.getText().toString());
@@ -125,12 +119,9 @@ public class EditIdentity extends K9Activity {
}
@Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- saveIdentity();
- return true;
- }
- return super.onKeyDown(keyCode, event);
+ public void onBackPressed() {
+ saveIdentity();
+ super.onBackPressed();
}
@Override
diff --git a/src/com/fsck/k9/activity/FolderList.java b/src/com/fsck/k9/activity/FolderList.java
index 30b0ed706..170927fc0 100644
--- a/src/com/fsck/k9/activity/FolderList.java
+++ b/src/com/fsck/k9/activity/FolderList.java
@@ -3,11 +3,14 @@ package com.fsck.k9.activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
+import android.text.Editable;
+import android.text.TextWatcher;
import android.util.Config;
import android.util.Log;
import android.util.TypedValue;
@@ -243,7 +246,7 @@ public class FolderList extends K9ListActivity {
mListView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_INSET);
mListView.setLongClickable(true);
mListView.setFastScrollEnabled(true);
- mListView.setScrollingCacheEnabled(true);
+ mListView.setScrollingCacheEnabled(false);
mListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView> parent, View view, int position, long id) {
onOpenFolder(((FolderInfoHolder)mAdapter.getItem(position)).name);
@@ -355,38 +358,18 @@ public class FolderList extends K9ListActivity {
@Override
public void onBackPressed() {
- // This will be called either automatically for you on 2.0
- // or later, or by the code above on earlier versions of the
- // platform.
if (K9.manageBack()) {
onAccounts();
} else {
- // TODO - when we move to android 2.0, uncomment this instead.
- // super.onBackPressed()
- finish();
+ super.onBackPressed();
}
}
- @Override public boolean onKeyDown(int keyCode, KeyEvent event) {
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
//Shortcuts that work no matter what is selected
-
- if (
- // TODO - when we move to android 2.0, uncomment this.
- // android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR &&
-
- keyCode == KeyEvent.KEYCODE_BACK
- && event.getRepeatCount() == 0
- && K9.manageBack()) {
- // Take care of calling this method on earlier versions of
- // the platform where it doesn't exist.
- onBackPressed();
- return true;
- }
-
-
switch (keyCode) {
case KeyEvent.KEYCODE_Q:
- //case KeyEvent.KEYCODE_BACK:
{
onAccounts();
return true;
@@ -441,6 +424,51 @@ public class FolderList extends K9ListActivity {
}
+ /**
+ * Show an alert with an input-field for a filter-expression.
+ * Filter {@link #mAdapter} with the user-input.
+ */
+ private void onEnterFilter() {
+ final AlertDialog.Builder filterAlert = new AlertDialog.Builder(this);
+
+ final EditText input = new EditText(this);
+ input.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ mAdapter.getFilter().filter(input.getText().toString());
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+ });
+ input.setHint(R.string.folder_list_filter_hint);
+ filterAlert.setView(input);
+
+ filterAlert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ String value = input.getText().toString().trim();
+ mAdapter.getFilter().filter(value);
+ }
+ });
+
+ filterAlert.setNegativeButton("Cancel",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ mAdapter.getFilter().filter("");
+ }
+ });
+
+ filterAlert.show();
+
+ }
+
private void onEditPrefs() {
Prefs.actionPrefs(this);
}
@@ -523,6 +551,11 @@ public class FolderList extends K9ListActivity {
return true;
+ case R.id.filter_folders:
+ onEnterFilter();
+
+ return true;
+
case R.id.account_settings:
onEditAccount();
@@ -889,6 +922,8 @@ public class FolderList extends K9ListActivity {
int unreadMessageCount = localFolder.getUnreadMessageCount();
FolderInfoHolder folderHolder = getFolder(folderName);
if (folderHolder != null) {
+ int oldUnreadMessageCount = folderHolder.unreadMessageCount;
+ mUnreadMessageCount += unreadMessageCount - oldUnreadMessageCount;
folderHolder.populate(context, localFolder, mAccount, unreadMessageCount);
mHandler.dataChanged();
}
@@ -959,6 +994,7 @@ public class FolderList extends K9ListActivity {
public void folderStatusChanged(Account account, String folderName, int unreadMessageCount) {
if (account.equals(mAccount)) {
refreshFolder(account, folderName);
+ informUserOfStatus();
}
}
@@ -1111,8 +1147,8 @@ public class FolderList extends K9ListActivity {
holder.chip.setBackgroundDrawable(mAccount.generateColorChip().drawable());
holder.chip.getBackground().setAlpha(folder.unreadMessageCount == 0 ? 127 : 255);
- holder.folderName.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getFolderName());
- holder.folderStatus.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getFolderStatus());
+ holder.folderName.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getFolderName());
+ holder.folderStatus.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getFolderStatus());
return view;
diff --git a/src/com/fsck/k9/activity/InsertableHtmlContent.java b/src/com/fsck/k9/activity/InsertableHtmlContent.java
index 168b90b71..ab413e19d 100644
--- a/src/com/fsck/k9/activity/InsertableHtmlContent.java
+++ b/src/com/fsck/k9/activity/InsertableHtmlContent.java
@@ -1,153 +1,161 @@
-package com.fsck.k9.activity;
-
-import java.io.Serializable;
-
-/**
- *
Represents an HTML document with an insertion point for placing a reply. The quoted
- * document may have been modified to make it suitable for insertion. The modified quoted
- * document should be used in place of the original document.
- *
- *
Changes to the user-generated inserted content should be done with {@link
- * #setUserContent(String)}.
- *
- * TODO: This container should also have a text part, along with its insertion point. Or maybe a generic InsertableContent and maintain one each for Html and Text?
- */
-class InsertableHtmlContent implements Serializable {
- private static final long serialVersionUID = 2397327034L;
- // Default to a headerInsertionPoint at the beginning of the message.
- private int headerInsertionPoint = 0;
- private int footerInsertionPoint = 0;
- // Quoted message, if any. headerInsertionPoint refers to a position in this string.
- private StringBuilder quotedContent = new StringBuilder();
- // User content (typically their reply or comments on a forward)
- private StringBuilder userContent = new StringBuilder();
- // Where to insert the content. Default to top posting.
- private InsertionLocation insertionLocation = InsertionLocation.BEFORE_QUOTE;
-
- /**
- * Defines where user content should be inserted, either before or after quoted content.
- */
- public enum InsertionLocation {
- BEFORE_QUOTE, AFTER_QUOTE
- }
-
- public void setHeaderInsertionPoint(int headerInsertionPoint) {
- this.headerInsertionPoint = headerInsertionPoint;
- }
-
- public void setFooterInsertionPoint(int footerInsertionPoint) {
- this.footerInsertionPoint = footerInsertionPoint;
- }
-
- /**
- * Get the quoted content.
- * @return Quoted content.
- */
- public String getQuotedContent() {
- return quotedContent.toString();
- }
-
- /**
- * Set the quoted content. The insertion point should be set against this content.
- * @param content
- */
- public void setQuotedContent(StringBuilder content) {
- this.quotedContent = content;
- }
-
- /**
- *
Insert something into the quoted content header. This is typically used for inserting
- * reply/forward headers into the quoted content rather than inserting the user-generated reply
- * content.
- *
- *
Subsequent calls to {@link #insertIntoQuotedHeader(String)} will prepend text onto any
- * existing header and quoted content.
- * @param content Content to add.
- */
- public void insertIntoQuotedHeader(final String content) {
- quotedContent.insert(headerInsertionPoint, content);
- // Update the location of the footer insertion point.
- footerInsertionPoint += content.length();
- }
-
- /**
- *
Insert something into the quoted content footer. This is typically used for inserting closing
- * tags of reply/forward headers rather than inserting the user-generated reply content.
- *
- *
Subsequent calls to {@link #insertIntoQuotedFooter(String)} will append text onto any
- * existing footer and quoted content.
- * @param content Content to add.
- */
- public void insertIntoQuotedFooter(final String content) {
- quotedContent.insert(footerInsertionPoint, content);
- // Update the location of the footer insertion point to the end of the inserted content.
- footerInsertionPoint += content.length();
- }
-
- /**
- * Remove all quoted content.
- */
- public void clearQuotedContent() {
- quotedContent.setLength(0);
- footerInsertionPoint = 0;
- headerInsertionPoint = 0;
- }
-
- /**
- * Set the inserted content to the specified content. Replaces anything currently in the
- * inserted content buffer.
- * @param content
- */
- public void setUserContent(final String content) {
- userContent = new StringBuilder(content);
- }
-
- /**
- * Configure where user content should be inserted, either before or after the quoted content.
- * @param insertionLocation Where to insert user content.
- */
- public void setInsertionLocation(final InsertionLocation insertionLocation) {
- this.insertionLocation = insertionLocation;
- }
-
- /**
- * Fetch the insertion point based upon the quote style.
- * @return Insertion point
- */
- public int getInsertionPoint() {
- if (insertionLocation == InsertionLocation.BEFORE_QUOTE) {
- return headerInsertionPoint;
- } else {
- return footerInsertionPoint;
- }
- }
-
- /**
- * Build the composed string with the inserted and original content.
- * @return Composed string.
- */
- @Override
- public String toString() {
- final int insertionPoint = getInsertionPoint();
- // Inserting and deleting was twice as fast as instantiating a new StringBuilder and
- // using substring() to build the new pieces.
- String result = quotedContent.insert(insertionPoint, userContent.toString()).toString();
- quotedContent.delete(insertionPoint, insertionPoint + userContent.length());
- return result;
- }
-
- /**
- * Return debugging information for this container.
- * @return Debug string.
- */
- public String toDebugString() {
- return "InsertableHtmlContent{" +
- "headerInsertionPoint=" + headerInsertionPoint +
- ", footerInsertionPoint=" + footerInsertionPoint +
- ", insertionLocation=" + insertionLocation +
- ", quotedContent=" + quotedContent +
- ", userContent=" + userContent +
- ", compiledResult=" + toString() +
- '}';
- }
-}
+package com.fsck.k9.activity;
+
+import java.io.Serializable;
+
+/**
+ *
Represents an HTML document with an insertion point for placing a reply. The quoted
+ * document may have been modified to make it suitable for insertion. The modified quoted
+ * document should be used in place of the original document.
+ *
+ *
Changes to the user-generated inserted content should be done with {@link
+ * #setUserContent(String)}.
+ *
+ * TODO: This container should also have a text part, along with its insertion point. Or maybe a generic InsertableContent and maintain one each for Html and Text?
+ */
+class InsertableHtmlContent implements Serializable {
+ private static final long serialVersionUID = 2397327034L;
+ // Default to a headerInsertionPoint at the beginning of the message.
+ private int headerInsertionPoint = 0;
+ private int footerInsertionPoint = 0;
+ // Quoted message, if any. headerInsertionPoint refers to a position in this string.
+ private StringBuilder quotedContent = new StringBuilder();
+ // User content (typically their reply or comments on a forward)
+ private StringBuilder userContent = new StringBuilder();
+ // Where to insert the content. Default to top posting.
+ private InsertionLocation insertionLocation = InsertionLocation.BEFORE_QUOTE;
+
+ /**
+ * Defines where user content should be inserted, either before or after quoted content.
+ */
+ public enum InsertionLocation {
+ BEFORE_QUOTE, AFTER_QUOTE
+ }
+
+ public void setHeaderInsertionPoint(int headerInsertionPoint) {
+ this.headerInsertionPoint = headerInsertionPoint;
+ }
+
+ public void setFooterInsertionPoint(int footerInsertionPoint) {
+ this.footerInsertionPoint = footerInsertionPoint;
+ }
+
+ /**
+ * Get the quoted content.
+ * @return Quoted content.
+ */
+ public String getQuotedContent() {
+ return quotedContent.toString();
+ }
+
+ /**
+ * Set the quoted content. The insertion point should be set against this content.
+ * @param content
+ */
+ public void setQuotedContent(StringBuilder content) {
+ this.quotedContent = content;
+ }
+
+ /**
+ *
Insert something into the quoted content header. This is typically used for inserting
+ * reply/forward headers into the quoted content rather than inserting the user-generated reply
+ * content.
+ *
+ *
Subsequent calls to {@link #insertIntoQuotedHeader(String)} will prepend text onto any
+ * existing header and quoted content.
+ * @param content Content to add.
+ */
+ public void insertIntoQuotedHeader(final String content) {
+ quotedContent.insert(headerInsertionPoint, content);
+ // Update the location of the footer insertion point.
+ footerInsertionPoint += content.length();
+ }
+
+ /**
+ *
Insert something into the quoted content footer. This is typically used for inserting closing
+ * tags of reply/forward headers rather than inserting the user-generated reply content.
+ *
+ *
Subsequent calls to {@link #insertIntoQuotedFooter(String)} will append text onto any
+ * existing footer and quoted content.
+ * @param content Content to add.
+ */
+ public void insertIntoQuotedFooter(final String content) {
+ quotedContent.insert(footerInsertionPoint, content);
+ // Update the location of the footer insertion point to the end of the inserted content.
+ footerInsertionPoint += content.length();
+ }
+
+ /**
+ * Remove all quoted content.
+ */
+ public void clearQuotedContent() {
+ quotedContent.setLength(0);
+ footerInsertionPoint = 0;
+ headerInsertionPoint = 0;
+ }
+
+ /**
+ * Set the inserted content to the specified content. Replaces anything currently in the
+ * inserted content buffer.
+ * @param content
+ */
+ public void setUserContent(final String content) {
+ userContent = new StringBuilder(content);
+ }
+
+ /**
+ * Configure where user content should be inserted, either before or after the quoted content.
+ * @param insertionLocation Where to insert user content.
+ */
+ public void setInsertionLocation(final InsertionLocation insertionLocation) {
+ this.insertionLocation = insertionLocation;
+ }
+
+ /**
+ * Fetch the insertion point based upon the quote style.
+ * @return Insertion point
+ */
+ public int getInsertionPoint() {
+ if (insertionLocation == InsertionLocation.BEFORE_QUOTE) {
+ return headerInsertionPoint;
+ } else {
+ return footerInsertionPoint;
+ }
+ }
+
+ /**
+ * Get the footer insertion point.
+ * @return Footer insertion point
+ */
+ public int getFooterInsertionPoint() {
+ return footerInsertionPoint;
+ }
+
+ /**
+ * Build the composed string with the inserted and original content.
+ * @return Composed string.
+ */
+ @Override
+ public String toString() {
+ final int insertionPoint = getInsertionPoint();
+ // Inserting and deleting was twice as fast as instantiating a new StringBuilder and
+ // using substring() to build the new pieces.
+ String result = quotedContent.insert(insertionPoint, userContent.toString()).toString();
+ quotedContent.delete(insertionPoint, insertionPoint + userContent.length());
+ return result;
+ }
+
+ /**
+ * Return debugging information for this container.
+ * @return Debug string.
+ */
+ public String toDebugString() {
+ return "InsertableHtmlContent{" +
+ "headerInsertionPoint=" + headerInsertionPoint +
+ ", footerInsertionPoint=" + footerInsertionPoint +
+ ", insertionLocation=" + insertionLocation +
+ ", quotedContent=" + quotedContent +
+ ", userContent=" + userContent +
+ ", compiledResult=" + toString() +
+ '}';
+ }
+}
diff --git a/src/com/fsck/k9/activity/K9Activity.java b/src/com/fsck/k9/activity/K9Activity.java
index 3fa72700b..4cbca5b09 100644
--- a/src/com/fsck/k9/activity/K9Activity.java
+++ b/src/com/fsck/k9/activity/K9Activity.java
@@ -7,6 +7,7 @@ import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
+import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
@@ -14,15 +15,14 @@ import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
-import android.widget.ScrollView;
import com.fsck.k9.K9;
-import com.fsck.k9.helper.DateFormatter;
+import com.fsck.k9.view.ToggleScrollView;
public class K9Activity extends Activity {
private GestureDetector gestureDetector;
- protected ScrollView mTopView;
+ protected ToggleScrollView mTopView;
@Override
public void onCreate(Bundle icicle) {
@@ -70,12 +70,9 @@ public class K9Activity extends Activity {
setupFormats();
}
- private java.text.DateFormat mDateFormat;
private java.text.DateFormat mTimeFormat;
private void setupFormats() {
-
- mDateFormat = DateFormatter.getDateFormat(this);
mTimeFormat = android.text.format.DateFormat.getTimeFormat(this); // 12/24 date format
}
@@ -83,15 +80,25 @@ public class K9Activity extends Activity {
return mTimeFormat;
}
- public java.text.DateFormat getDateFormat() {
- return mDateFormat;
- }
- protected void onNext() {
-
- }
- protected void onPrevious() {
+ /**
+ * Called when a swipe from right to left is handled by {@link MyGestureDetector}. See
+ * {@link android.view.GestureDetector.OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float)}
+ * for more information on the {@link MotionEvent}s being passed.
+ * @param e1 First down motion event that started the fling.
+ * @param e2 The move motion event that triggered the current onFling.
+ */
+ protected void onSwipeRightToLeft(final MotionEvent e1, final MotionEvent e2) {
}
+ /**
+ * Called when a swipe from left to right is handled by {@link MyGestureDetector}. See
+ * {@link android.view.GestureDetector.OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float)}
+ * for more information on the {@link MotionEvent}s being passed.
+ * @param e1 First down motion event that started the fling.
+ * @param e2 The move motion event that triggered the current onFling.
+ */
+ protected void onSwipeLeftToRight(final MotionEvent e1, final MotionEvent e2) {
+ }
protected Animation inFromRightAnimation() {
return slideAnimation(0.0f, +1.0f);
@@ -114,8 +121,26 @@ public class K9Activity extends Activity {
}
class MyGestureDetector extends SimpleOnGestureListener {
+ private boolean gesturesEnabled = false;
+
+ /**
+ * Creates a new {@link android.view.GestureDetector.OnGestureListener}. Enabled/disabled based upon
+ * {@link com.fsck.k9.K9#gesturesEnabled()}}.
+ */
+ public MyGestureDetector() {
+ super();
+ }
+
+ /**
+ * Create a new {@link android.view.GestureDetector.OnGestureListener}.
+ * @param gesturesEnabled Setting to true will enable gesture detection,
+ * regardless of the system-wide gesture setting.
+ */
+ public MyGestureDetector(final boolean gesturesEnabled) {
+ super();
+ this.gesturesEnabled = gesturesEnabled;
+ }
- private static final float SWIPE_MIN_DISTANCE_DIP = 130.0f;
private static final float SWIPE_MAX_OFF_PATH_DIP = 250f;
private static final float SWIPE_THRESHOLD_VELOCITY_DIP = 325f;
@@ -137,22 +162,52 @@ public class K9Activity extends Activity {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
- if (K9.gesturesEnabled()) {
- // Convert the dips to pixels
+ // Do fling-detection if gestures are force-enabled or we have system-wide gestures enabled.
+ if (gesturesEnabled || K9.gesturesEnabled()) {
+ // Calculate the minimum distance required for this to count as a swipe.
+ // Convert the constant dips to pixels.
final float mGestureScale = getResources().getDisplayMetrics().density;
- int min_distance = (int)(SWIPE_MIN_DISTANCE_DIP * mGestureScale + 0.5f);
- int min_velocity = (int)(SWIPE_THRESHOLD_VELOCITY_DIP * mGestureScale + 0.5f);
- int max_off_path = (int)(SWIPE_MAX_OFF_PATH_DIP * mGestureScale + 0.5f);
+ final int minVelocity = (int)(SWIPE_THRESHOLD_VELOCITY_DIP * mGestureScale + 0.5f);
+ final int maxOffPath = (int)(SWIPE_MAX_OFF_PATH_DIP * mGestureScale + 0.5f);
+
+ // Calculate how much was actually swiped.
+ final float deltaX = e2.getX() - e1.getX();
+ final float deltaY = e2.getY() - e1.getY();
+
+ // Calculate the minimum distance required for this to be considered a swipe.
+ final int minDistance = (int)Math.abs(deltaY * 4);
+ if(K9.DEBUG) {
+ final boolean movedAcross = (Math.abs(deltaX) > Math.abs(deltaY * 4));
+ final boolean steadyHand = (Math.abs(deltaX / deltaY) > 2);
+ Log.d(K9.LOG_TAG, String.format("Old swipe algorithm: movedAcross=%s steadyHand=%s result=%s", movedAcross, steadyHand, movedAcross && steadyHand));
+ Log.d(K9.LOG_TAG, String.format("New swipe algorithm: deltaX=%.2f deltaY=%.2f minDistance=%d velocity=%.2f (min=%d)", deltaX, deltaY, minDistance, velocityX, minVelocity));
+ }
try {
- if (Math.abs(e1.getY() - e2.getY()) > max_off_path)
+ if (Math.abs(deltaY) > maxOffPath) {
+ if(K9.DEBUG)
+ Log.d(K9.LOG_TAG, "New swipe algorithm: Swipe too far off horizontal path.");
return false;
+ }
+ if(Math.abs(velocityX) < minVelocity) {
+ if(K9.DEBUG)
+ Log.d(K9.LOG_TAG, "New swipe algorithm: Swipe too slow.");
+ return false;
+ }
// right to left swipe
- if (e1.getX() - e2.getX() > min_distance && Math.abs(velocityX) > min_velocity) {
- onNext();
- } else if (e2.getX() - e1.getX() > min_distance && Math.abs(velocityX) > min_velocity) {
- onPrevious();
+ if (deltaX < (minDistance * -1)) {
+ onSwipeRightToLeft(e1, e2);
+ if(K9.DEBUG)
+ Log.d(K9.LOG_TAG, "New swipe algorithm: Right to Left swipe OK.");
+ } else if (deltaX > minDistance) {
+ onSwipeLeftToRight(e1, e2);
+ if(K9.DEBUG)
+ Log.d(K9.LOG_TAG, "New swipe algorithm: Left to Right swipe OK.");
+ } else {
+ if(K9.DEBUG)
+ Log.d(K9.LOG_TAG, "New swipe algorithm: Swipe did not meet minimum distance requirements.");
+ return false;
}
} catch (Exception e) {
// nothing
@@ -161,6 +216,4 @@ public class K9Activity extends Activity {
return false;
}
}
-
-
}
diff --git a/src/com/fsck/k9/activity/LauncherShortcuts.java b/src/com/fsck/k9/activity/LauncherShortcuts.java
index 58107e54d..61bde33ca 100644
--- a/src/com/fsck/k9/activity/LauncherShortcuts.java
+++ b/src/com/fsck/k9/activity/LauncherShortcuts.java
@@ -3,53 +3,42 @@ package com.fsck.k9.activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
import com.fsck.k9.Account;
-import com.fsck.k9.FontSizes;
-import com.fsck.k9.K9;
-import com.fsck.k9.Preferences;
+import com.fsck.k9.BaseAccount;
import com.fsck.k9.R;
+import com.fsck.k9.SearchSpecification;
-public class LauncherShortcuts extends K9ListActivity implements OnItemClickListener {
- private AccountsAdapter mAdapter;
- private FontSizes mFontSizes = K9.getFontSizes();
-
+public class LauncherShortcuts extends AccountList {
@Override
public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
// finish() immediately if we aren't supposed to be here
if (!Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) {
finish();
return;
}
- setContentView(R.layout.launcher_shortcuts);
- ListView listView = getListView();
- listView.setOnItemClickListener(this);
- listView.setItemsCanFocus(false);
-
- refresh();
+ super.onCreate(icicle);
}
- private void refresh() {
- Account[] accounts = Preferences.getPreferences(this).getAccounts();
-
- mAdapter = new AccountsAdapter(accounts);
- getListView().setAdapter(mAdapter);
+ @Override
+ protected boolean displaySpecialAccounts() {
+ return true;
}
- private void setupShortcut(Account account) {
- final Intent shortcutIntent = FolderList.actionHandleAccountIntent(this, account, null, true);
+ @Override
+ protected void onAccountSelected(BaseAccount account) {
+ Intent shortcutIntent = null;
+ if (account instanceof SearchSpecification) {
+ shortcutIntent = MessageList.actionHandleAccountIntent(this, account.getDescription(),
+ (SearchSpecification) account);
+ } else {
+ shortcutIntent = FolderList.actionHandleAccountIntent(this, (Account) account, null,
+ true);
+ }
+
+ shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
String description = account.getDescription();
@@ -63,66 +52,4 @@ public class LauncherShortcuts extends K9ListActivity implements OnItemClickList
setResult(RESULT_OK, intent);
finish();
}
-
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
- Account account = (Account) parent.getItemAtPosition(position);
- setupShortcut(account);
- }
-
- class AccountsAdapter extends ArrayAdapter {
- public AccountsAdapter(Account[] accounts) {
- super(LauncherShortcuts.this, 0, accounts);
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- final Account account = getItem(position);
-
- final View view;
- if (convertView != null) {
- view = convertView;
- } else {
- view = getLayoutInflater().inflate(R.layout.accounts_item, parent, false);
- view.findViewById(R.id.active_icons).setVisibility(View.GONE);
- }
-
- AccountViewHolder holder = (AccountViewHolder) view.getTag();
- if (holder == null) {
- holder = new AccountViewHolder();
- holder.description = (TextView) view.findViewById(R.id.description);
- holder.email = (TextView) view.findViewById(R.id.email);
- holder.chip = view.findViewById(R.id.chip);
-
- view.setTag(holder);
- }
-
- String description = account.getDescription();
- if (account.getEmail().equals(description)) {
- holder.email.setVisibility(View.GONE);
- } else {
- holder.email.setVisibility(View.VISIBLE);
- holder.email.setText(account.getEmail());
- }
-
- if (description == null || description.length() == 0) {
- description = account.getEmail();
- }
-
- holder.description.setText(description);
-
- holder.chip.setBackgroundColor(account.getChipColor());
- holder.chip.getBackground().setAlpha(255);
-
- holder.description.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getAccountName());
- holder.email.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getAccountDescription());
-
- return view;
- }
-
- class AccountViewHolder {
- public TextView description;
- public TextView email;
- public View chip;
- }
- }
}
diff --git a/src/com/fsck/k9/activity/ManageIdentities.java b/src/com/fsck/k9/activity/ManageIdentities.java
index 3e5d83813..a15aaaa6f 100644
--- a/src/com/fsck/k9/activity/ManageIdentities.java
+++ b/src/com/fsck/k9/activity/ManageIdentities.java
@@ -119,11 +119,9 @@ public class ManageIdentities extends ChooseIdentity {
@Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- saveIdentities();
- }
- return super.onKeyDown(keyCode, event);
+ public void onBackPressed() {
+ saveIdentities();
+ super.onBackPressed();
}
private void saveIdentities() {
diff --git a/src/com/fsck/k9/activity/MessageCompose.java b/src/com/fsck/k9/activity/MessageCompose.java
index 17a5addf7..8b85cfd95 100644
--- a/src/com/fsck/k9/activity/MessageCompose.java
+++ b/src/com/fsck/k9/activity/MessageCompose.java
@@ -10,6 +10,7 @@ import java.util.regex.Pattern;
import android.text.*;
import android.webkit.WebViewClient;
import com.fsck.k9.helper.HtmlConverter;
+import com.fsck.k9.helper.StringUtils;
import com.fsck.k9.mail.*;
import com.fsck.k9.view.MessageWebView;
import org.apache.james.mime4j.codec.EncoderUtil;
@@ -29,7 +30,7 @@ import android.os.Parcelable;
import android.provider.OpenableColumns;
import android.text.util.Rfc822Tokenizer;
import android.util.Log;
-import android.view.KeyEvent;
+import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -47,11 +48,17 @@ import android.widget.MultiAutoCompleteTextView;
import android.widget.TextView;
import android.widget.Toast;
+import org.htmlcleaner.CleanerProperties;
+import org.htmlcleaner.HtmlCleaner;
+import org.htmlcleaner.SimpleHtmlSerializer;
+import org.htmlcleaner.TagNode;
+
import com.fsck.k9.Account;
import com.fsck.k9.Account.QuoteStyle;
import com.fsck.k9.Account.MessageFormat;
import com.fsck.k9.EmailAddressAdapter;
import com.fsck.k9.EmailAddressValidator;
+import com.fsck.k9.FontSizes;
import com.fsck.k9.Identity;
import com.fsck.k9.K9;
import com.fsck.k9.Preferences;
@@ -74,7 +81,13 @@ import com.fsck.k9.mail.store.LocalStore.LocalAttachmentBody;
public class MessageCompose extends K9Activity implements OnClickListener, OnFocusChangeListener {
private static final int DIALOG_SAVE_OR_DISCARD_DRAFT_MESSAGE = 1;
+ private static final int DIALOG_REFUSE_TO_SAVE_DRAFT_MARKED_ENCRYPTED = 2;
+ private static final int DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY = 3;
+ private static final int DIALOG_CONFIRM_DISCARD_ON_BACK = 4;
+ private static final long INVALID_DRAFT_ID = MessagingController.INVALID_MESSAGE_ID;
+
+ private static final String ACTION_COMPOSE = "com.fsck.k9.intent.action.COMPOSE";
private static final String ACTION_REPLY = "com.fsck.k9.intent.action.REPLY";
private static final String ACTION_REPLY_ALL = "com.fsck.k9.intent.action.REPLY_ALL";
private static final String ACTION_FORWARD = "com.fsck.k9.intent.action.FORWARD";
@@ -94,8 +107,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
"com.fsck.k9.activity.MessageCompose.QuotedTextShown";
private static final String STATE_KEY_SOURCE_MESSAGE_PROCED =
"com.fsck.k9.activity.MessageCompose.stateKeySourceMessageProced";
- private static final String STATE_KEY_DRAFT_UID =
- "com.fsck.k9.activity.MessageCompose.draftUid";
+ private static final String STATE_KEY_DRAFT_ID = "com.fsck.k9.activity.MessageCompose.draftId";
private static final String STATE_KEY_HTML_QUOTE = "com.fsck.k9.activity.MessageCompose.HTMLQuote";
private static final String STATE_IDENTITY_CHANGED =
"com.fsck.k9.activity.MessageCompose.identityChanged";
@@ -105,6 +117,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
private static final String STATE_IN_REPLY_TO = "com.fsck.k9.activity.MessageCompose.inReplyTo";
private static final String STATE_REFERENCES = "com.fsck.k9.activity.MessageCompose.references";
private static final String STATE_KEY_MESSAGE_FORMAT = "com.fsck.k9.activity.MessageCompose.messageFormat";
+ private static final String STATE_KEY_READ_RECEIPT = "com.fsck.k9.activity.MessageCompose.messageReadReceipt";
+ private static final String STATE_KEY_DRAFT_NEEDS_SAVING = "com.fsck.k9.activity.MessageCompose.mDraftNeedsSaving";
private static final int MSG_PROGRESS_ON = 1;
private static final int MSG_PROGRESS_OFF = 2;
@@ -127,7 +141,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
* Currently:
* - "Aw:" (german: abbreviation for "Antwort")
*/
- private static final Pattern prefix = Pattern.compile("^AW[:\\s]\\s*", Pattern.CASE_INSENSITIVE);
+ private static final Pattern PREFIX = Pattern.compile("^AW[:\\s]\\s*", Pattern.CASE_INSENSITIVE);
/**
* The account used for message composition.
@@ -168,6 +182,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
HIDE
};
+ private boolean mReadReceipt = false;
+
private QuotedTextMode mQuotedTextMode = QuotedTextMode.NONE;
private TextView mFromView;
@@ -198,21 +214,30 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
private ImageButton mAddBccFromContacts;
private PgpData mPgpData = null;
+ private boolean mAutoEncrypt = false;
+ private boolean mContinueWithoutPublicKey = false;
private String mReferences;
private String mInReplyTo;
private boolean mSourceProcessed = false;
private MessageFormat mMessageFormat;
+ private QuoteStyle mQuoteStyle;
private boolean mDraftNeedsSaving = false;
private boolean mPreventDraftSaving = false;
/**
- * The draft uid of this message. This is used when saving drafts so that the same draft is
- * overwritten instead of being created anew. This property is null until the first save.
+ * If this is {@code true} we don't save the message as a draft in {@link #onPause()}.
*/
- private String mDraftUid;
+ private boolean mIgnoreOnPause = false;
+
+ /**
+ * The database ID of this message's draft. This is used when saving drafts so the message in
+ * the database is updated instead of being created anew. This property is INVALID_DRAFT_ID
+ * until the first save.
+ */
+ private long mDraftId = INVALID_DRAFT_ID;
private Handler mHandler = new Handler() {
@Override
@@ -256,6 +281,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
private EmailAddressAdapter mAddressAdapter;
private Validator mAddressValidator;
+ private FontSizes mFontSizes = K9.getFontSizes();
+
static class Attachment implements Serializable {
private static final long serialVersionUID = 3642382876618963734L;
@@ -272,11 +299,13 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
* @param account
*/
public static void actionCompose(Context context, Account account) {
- if (account == null) {
- account = Preferences.getPreferences(context).getDefaultAccount();
- }
+ String accountUuid = (account == null) ?
+ Preferences.getPreferences(context).getDefaultAccount().getUuid() :
+ account.getUuid();
+
Intent i = new Intent(context, MessageCompose.class);
- i.putExtra(EXTRA_ACCOUNT, account.getUuid());
+ i.putExtra(EXTRA_ACCOUNT, accountUuid);
+ i.setAction(ACTION_COMPOSE);
context.startActivity(i);
}
@@ -419,33 +448,68 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
});
TextWatcher watcher = new TextWatcher() {
- public void beforeTextChanged(CharSequence s, int start,
- int before, int after) { }
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int before, int after) {
+ /* do nothing */
+ }
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
mDraftNeedsSaving = true;
}
- public void afterTextChanged(android.text.Editable s) { }
+ @Override
+ public void afterTextChanged(android.text.Editable s) { /* do nothing */ }
+ };
+
+ // For watching changes to the To:, Cc:, and Bcc: fields for auto-encryption on a matching
+ // address.
+ TextWatcher recipientWatcher = new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int before, int after) {
+ /* do nothing */
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ mDraftNeedsSaving = true;
+ }
+
+ @Override
+ public void afterTextChanged(android.text.Editable s) {
+ final CryptoProvider crypto = mAccount.getCryptoProvider();
+ if (mAutoEncrypt && crypto.isAvailable(getApplicationContext())) {
+ for (Address address : getRecipientAddresses()) {
+ if (crypto.hasPublicKeyForEmail(getApplicationContext(),
+ address.getAddress())) {
+ mEncryptCheckbox.setChecked(true);
+ mContinueWithoutPublicKey = false;
+ break;
+ }
+ }
+ }
+ }
};
TextWatcher sigwatcher = new TextWatcher() {
- public void beforeTextChanged(CharSequence s, int start,
- int before, int after) { }
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int before, int after) {
+ /* do nothing */
+ }
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
mDraftNeedsSaving = true;
mSignatureChanged = true;
}
- public void afterTextChanged(android.text.Editable s) { }
+ @Override
+ public void afterTextChanged(android.text.Editable s) { /* do nothing */ }
};
- mToView.addTextChangedListener(watcher);
- mCcView.addTextChangedListener(watcher);
- mBccView.addTextChangedListener(watcher);
+ mToView.addTextChangedListener(recipientWatcher);
+ mCcView.addTextChangedListener(recipientWatcher);
+ mBccView.addTextChangedListener(recipientWatcher);
mSubjectView.addTextChangedListener(watcher);
mMessageContentView.addTextChangedListener(watcher);
@@ -530,6 +594,18 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
mMessageFormat = mAccount.getMessageFormat();
+ if (mMessageFormat == MessageFormat.AUTO) {
+ if (ACTION_COMPOSE.equals(action)) {
+ mMessageFormat = MessageFormat.TEXT;
+ } else if (mSourceMessageBody != null) {
+ // mSourceMessageBody is set to something when replying to and forwarding decrypted
+ // messages, so we set the format to plain text.
+ mMessageFormat = MessageFormat.TEXT;
+ }
+ }
+
+ mReadReceipt = mAccount.isMessageReadReceiptAlways();
+ mQuoteStyle = mAccount.getQuoteStyle();
if (!mSourceMessageProcessed) {
updateFrom();
@@ -592,6 +668,11 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
mCryptoSignatureUserId = (TextView)findViewById(R.id.userId);
mCryptoSignatureUserIdRest = (TextView)findViewById(R.id.userIdRest);
mEncryptCheckbox = (CheckBox)findViewById(R.id.cb_encrypt);
+ if (mSourceMessageBody != null) {
+ // mSourceMessageBody is set to something when replying to and forwarding decrypted
+ // messages, so the sender probably wants the message to be encrypted.
+ mEncryptCheckbox.setChecked(true);
+ }
initializeCrypto();
final CryptoProvider crypto = mAccount.getCryptoProvider();
@@ -625,11 +706,22 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
}
updateEncryptLayout();
+ mAutoEncrypt = mAccount.isCryptoAutoEncrypt();
} else {
mEncryptLayout.setVisibility(View.GONE);
}
mDraftNeedsSaving = false;
+
+ // Set font size of input controls
+ int fontSize = mFontSizes.getMessageComposeInput();
+ mToView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
+ mCcView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
+ mBccView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
+ mSubjectView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
+ mMessageContentView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
+ mQuotedText.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
+ mSignatureView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
}
/**
@@ -659,9 +751,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
* it wrong! So go fix your program or get AOSP to change the documentation.
*/
}
- //TODO: Use constant Intent.ACTION_SEND_MULTIPLE once we drop Android 1.5 support
- else if (Intent.ACTION_SEND.equals(action) ||
- "android.intent.action.SEND_MULTIPLE".equals(action)) {
+ else if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) {
/*
* Note: Here we allow a slight deviation from the documentated behavior.
* EXTRA_TEXT is used as message body (if available) regardless of the MIME
@@ -723,7 +813,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
private boolean setRecipients(TextView view, List recipients) {
boolean recipientAdded = false;
if (recipients != null) {
- StringBuffer addressList = new StringBuffer();
+ StringBuilder addressList = new StringBuilder();
for (String recipient : recipients) {
addressList.append(recipient);
addressList.append(", ");
@@ -752,6 +842,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
mCryptoSignatureUserId.setVisibility(View.INVISIBLE);
mCryptoSignatureUserIdRest.setVisibility(View.INVISIBLE);
} else {
+ mMessageFormat = MessageFormat.TEXT;
// if a signature key is selected, then the checkbox itself has no text
mCryptoSignatureCheckbox.setText("");
mCryptoSignatureCheckbox.setChecked(true);
@@ -779,14 +870,19 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
@Override
public void onResume() {
super.onResume();
+ mIgnoreOnPause = false;
MessagingController.getInstance(getApplication()).addListener(mListener);
}
@Override
public void onPause() {
super.onPause();
- saveIfNeeded();
MessagingController.getInstance(getApplication()).removeListener(mListener);
+ // Save email as draft when activity is changed (go to home screen, call received) or screen locked
+ // don't do this if only changing orientations
+ if (!mIgnoreOnPause && (getChangingConfigurations() & ActivityInfo.CONFIG_ORIENTATION) == 0) {
+ saveIfNeeded();
+ }
}
/**
@@ -800,7 +896,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- saveIfNeeded();
ArrayList attachments = new ArrayList();
for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) {
View view = mAttachments.getChildAt(i);
@@ -808,11 +903,11 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
attachments.add(attachment.uri);
}
outState.putParcelableArrayList(STATE_KEY_ATTACHMENTS, attachments);
- outState.putBoolean(STATE_KEY_CC_SHOWN, mCcView.getVisibility() == View.VISIBLE);
- outState.putBoolean(STATE_KEY_BCC_SHOWN, mBccView.getVisibility() == View.VISIBLE);
+ outState.putBoolean(STATE_KEY_CC_SHOWN, mCcWrapper.getVisibility() == View.VISIBLE);
+ outState.putBoolean(STATE_KEY_BCC_SHOWN, mBccWrapper.getVisibility() == View.VISIBLE);
outState.putSerializable(STATE_KEY_QUOTED_TEXT_MODE, mQuotedTextMode);
outState.putBoolean(STATE_KEY_SOURCE_MESSAGE_PROCED, mSourceMessageProcessed);
- outState.putString(STATE_KEY_DRAFT_UID, mDraftUid);
+ outState.putLong(STATE_KEY_DRAFT_ID, mDraftId);
outState.putSerializable(STATE_IDENTITY, mIdentity);
outState.putBoolean(STATE_IDENTITY_CHANGED, mIdentityChanged);
outState.putSerializable(STATE_PGP_DATA, mPgpData);
@@ -820,6 +915,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
outState.putString(STATE_REFERENCES, mReferences);
outState.putSerializable(STATE_KEY_HTML_QUOTE, mQuotedHtmlContent);
outState.putSerializable(STATE_KEY_MESSAGE_FORMAT, mMessageFormat);
+ outState.putBoolean(STATE_KEY_READ_RECEIPT, mReadReceipt);
+ outState.putBoolean(STATE_KEY_DRAFT_NEEDS_SAVING, mDraftNeedsSaving);
}
@Override
@@ -834,31 +931,32 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
mMessageFormat = (MessageFormat) savedInstanceState
.getSerializable(STATE_KEY_MESSAGE_FORMAT);
+ mReadReceipt = savedInstanceState
+ .getBoolean(STATE_KEY_READ_RECEIPT);
mCcWrapper.setVisibility(savedInstanceState.getBoolean(STATE_KEY_CC_SHOWN) ? View.VISIBLE
: View.GONE);
mBccWrapper.setVisibility(savedInstanceState
.getBoolean(STATE_KEY_BCC_SHOWN) ? View.VISIBLE : View.GONE);
showOrHideQuotedText((QuotedTextMode)savedInstanceState.getSerializable(STATE_KEY_QUOTED_TEXT_MODE));
-
if (mQuotedTextMode != QuotedTextMode.NONE && mMessageFormat == MessageFormat.HTML) {
mQuotedHtmlContent = (InsertableHtmlContent) savedInstanceState.getSerializable(STATE_KEY_HTML_QUOTE);
if (mQuotedHtmlContent != null && mQuotedHtmlContent.getQuotedContent() != null) {
mQuotedHTML.loadDataWithBaseURL("http://", mQuotedHtmlContent.getQuotedContent(), "text/html", "utf-8", null);
}
}
- mDraftUid = savedInstanceState.getString(STATE_KEY_DRAFT_UID);
+ mDraftId = savedInstanceState.getLong(STATE_KEY_DRAFT_ID);
mIdentity = (Identity)savedInstanceState.getSerializable(STATE_IDENTITY);
mIdentityChanged = savedInstanceState.getBoolean(STATE_IDENTITY_CHANGED);
mPgpData = (PgpData) savedInstanceState.getSerializable(STATE_PGP_DATA);
mInReplyTo = savedInstanceState.getString(STATE_IN_REPLY_TO);
mReferences = savedInstanceState.getString(STATE_REFERENCES);
+ mDraftNeedsSaving = savedInstanceState.getBoolean(STATE_KEY_DRAFT_NEEDS_SAVING);
initializeCrypto();
updateFrom();
updateSignature();
updateEncryptLayout();
- mDraftNeedsSaving = false;
}
private void updateTitle() {
@@ -869,6 +967,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
}
+ @Override
public void onFocusChange(View view, boolean focused) {
if (!focused) {
updateTitle();
@@ -893,6 +992,16 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
return Address.parseUnencoded(view.getText().toString().trim());
}
+ /*
+ * Returns an Address array of recipients this email will be sent to.
+ * @return Address array of recipients this email will be sent to.
+ */
+ private Address[] getRecipientAddresses() {
+ String addresses = mToView.getText().toString() + mCcView.getText().toString()
+ + mBccView.getText().toString();
+ return Address.parseUnencoded(addresses.trim());
+ }
+
/*
* Build the Body that will contain the text of the message. We'll decide where to
* include it later. Draft messages are treated somewhat differently in that signatures are not
@@ -900,114 +1009,155 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
* @param isDraft If we should build a message that will be saved as a draft (as opposed to sent).
*/
private TextBody buildText(boolean isDraft) {
- boolean replyAfterQuote = false;
- String action = getIntent().getAction();
- if (mAccount.isReplyAfterQuote() &&
- (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action))) {
- replyAfterQuote = true;
- }
+ return buildText(isDraft, mMessageFormat);
+ }
+ /**
+ * Build the {@link Body} that will contain the text of the message.
+ *
+ *
+ * Draft messages are treated somewhat differently in that signatures are not appended and HTML
+ * separators between composed text and quoted text are not added.
+ *
+ *
+ * @param isDraft
+ * If {@code true} we build a message that will be saved as a draft (as opposed to
+ * sent).
+ * @param messageFormat
+ * Specifies what type of message to build ({@code text/plain} vs. {@code text/html}).
+ *
+ * @return {@link TextBody} instance that contains the entered text and possibly the quoted
+ * original message.
+ */
+ private TextBody buildText(boolean isDraft, MessageFormat messageFormat) {
+ // The length of the formatted version of the user-supplied text/reply
+ int composedMessageLength;
+
+ // The offset of the user-supplied text/reply in the final text body
+ int composedMessageOffset;
+
+ /*
+ * Find out if we need to include the original message as quoted text.
+ *
+ * We include the quoted text in the body if the user didn't choose to hide it. We always
+ * include the quoted text when we're saving a draft. That's so the user is able to
+ * "un-hide" the quoted text if (s)he opens a saved draft.
+ */
+ boolean includeQuotedText = (mQuotedTextMode.equals(QuotedTextMode.SHOW) || isDraft);
+
+ // Reply after quote makes no sense for HEADER style replies
+ boolean replyAfterQuote = (mQuoteStyle == QuoteStyle.HEADER) ?
+ false : mAccount.isReplyAfterQuote();
+
+ boolean signatureBeforeQuotedText = mAccount.isSignatureBeforeQuotedText();
+
+ // Get the user-supplied text
String text = mMessageContentView.getText().toString();
- boolean discardQuotedText = false;
- if (!isDraft && !mQuotedTextMode.equals(QuotedTextMode.SHOW)) {
- discardQuotedText = true;
- }
+ // Handle HTML separate from the rest of the text content
+ if (messageFormat == MessageFormat.HTML) {
- if (discardQuotedText) {
- if (!isDraft) {
- text = appendSignature(text);
- }
+ // Do we have to modify an existing message to include our reply?
+ if (includeQuotedText && mQuotedHtmlContent != null) {
+ if (K9.DEBUG) {
+ Log.d(K9.LOG_TAG, "insertable: " + mQuotedHtmlContent.toDebugString());
+ }
- // Build the body.
- TextBody body = new TextBody(text);
- body.setComposedMessageLength(text.length());
- body.setComposedMessageOffset(0);
+ if (!isDraft) {
+ // Append signature to the reply
+ if (replyAfterQuote || signatureBeforeQuotedText) {
+ text = appendSignature(text);
+ }
+ }
- return body;
- }
- // Handle HTML separate from the rest of the text content. HTML mode doesn't allow signature after the quoted
- // text, nor does it allow reply after quote. Users who want that functionality will need to stick with text
- // mode.
- else if (mMessageFormat == MessageFormat.HTML) {
- // Add the signature.
- if (!isDraft) {
- text = appendSignature(text);
- }
- text = HtmlConverter.textToHtmlFragment(text);
- // Insert it into the existing content object.
- if (K9.DEBUG && mQuotedHtmlContent != null)
- Log.d(K9.LOG_TAG, "insertable: " + mQuotedHtmlContent.toDebugString());
- if (mQuotedHtmlContent != null) {
+ // Convert the text to HTML
+ text = HtmlConverter.textToHtmlFragment(text);
- // Set the insertion location based upon our reply after quote setting. Reply after
- // quote makes no sense for HEADER style replies. In addition, add some extra
- // separators between the composed message and quoted message depending on the quote
- // location. We only add the extra separators when we're sending, that way when we
- // load a draft, we don't have to know the length of the separators to remove them
- // before editing.
- if (mAccount.getQuoteStyle() == QuoteStyle.PREFIX && replyAfterQuote) {
- mQuotedHtmlContent.setInsertionLocation(InsertableHtmlContent.InsertionLocation.AFTER_QUOTE);
+ /*
+ * Set the insertion location based upon our reply after quote setting.
+ * Additionally, add some extra separators between the composed message and quoted
+ * message depending on the quote location. We only add the extra separators when
+ * we're sending, that way when we load a draft, we don't have to know the length
+ * of the separators to remove them before editing.
+ */
+ if (replyAfterQuote) {
+ mQuotedHtmlContent.setInsertionLocation(
+ InsertableHtmlContent.InsertionLocation.AFTER_QUOTE);
if (!isDraft) {
text = " " + text;
}
} else {
- mQuotedHtmlContent.setInsertionLocation(InsertableHtmlContent.InsertionLocation.BEFORE_QUOTE);
+ mQuotedHtmlContent.setInsertionLocation(
+ InsertableHtmlContent.InsertionLocation.BEFORE_QUOTE);
if (!isDraft) {
text += "
";
}
}
+ if (!isDraft) {
+ // Place signature immediately after the quoted text
+ if (!(replyAfterQuote || signatureBeforeQuotedText)) {
+ mQuotedHtmlContent.insertIntoQuotedFooter(getSignatureHtml());
+ }
+ }
+
mQuotedHtmlContent.setUserContent(text);
- // All done. Build the body.
- TextBody body = new TextBody(mQuotedHtmlContent.toString());
// Save length of the body and its offset. This is used when thawing drafts.
- body.setComposedMessageLength(text.length());
- body.setComposedMessageOffset(mQuotedHtmlContent.getInsertionPoint());
- return body;
+ composedMessageLength = text.length();
+ composedMessageOffset = mQuotedHtmlContent.getInsertionPoint();
+ text = mQuotedHtmlContent.toString();
+
} else {
- TextBody body = new TextBody(text);
- body.setComposedMessageLength(text.length());
- // Not in reply to anything so the message starts at the beginning (0).
- body.setComposedMessageOffset(0);
- return body;
+ // There is no text to quote so simply append the signature if available
+ if (!isDraft) {
+ text = appendSignature(text);
+ }
+
+ // Convert the text to HTML
+ text = HtmlConverter.textToHtmlFragment(text);
+
+ //TODO: Wrap this in proper HTML tags
+
+ composedMessageLength = text.length();
+ composedMessageOffset = 0;
}
- } else if (mMessageFormat == MessageFormat.TEXT) {
+
+ } else {
// Capture composed message length before we start attaching quoted parts and signatures.
- Integer composedMessageLength = text.length();
- Integer composedMessageOffset = 0;
+ composedMessageLength = text.length();
+ composedMessageOffset = 0;
- // Placing the signature before the quoted text does not make sense if replyAfterQuote is true.
- if (!replyAfterQuote && !isDraft && mAccount.isSignatureBeforeQuotedText()) {
- text = appendSignature(text);
- }
-
- if (mQuotedTextMode != QuotedTextMode.NONE) {
- if (replyAfterQuote) {
- composedMessageOffset = mQuotedText.getText().toString().length() + "\n".length();
- text = mQuotedText.getText().toString() + "\n" + text;
- } else {
- text += "\n\n" + mQuotedText.getText().toString();
+ if (!isDraft) {
+ // Append signature to the text/reply
+ if (replyAfterQuote || signatureBeforeQuotedText) {
+ text = appendSignature(text);
}
}
- // Note: If user has selected reply after quote AND signature before quote, ignore the
- // latter setting and append the signature at the end.
- if (!isDraft && (!mAccount.isSignatureBeforeQuotedText() || replyAfterQuote)) {
- text = appendSignature(text);
+ if (includeQuotedText) {
+ String quotedText = mQuotedText.getText().toString();
+ if (replyAfterQuote) {
+ composedMessageOffset = quotedText.length() + "\n".length();
+ text = quotedText + "\n" + text;
+ } else {
+ text += "\n\n" + quotedText.toString();
+ }
}
- // Build the body.
- TextBody body = new TextBody(text);
- body.setComposedMessageLength(composedMessageLength);
- body.setComposedMessageOffset(composedMessageOffset);
-
- return body;
- } else {
- // Shouldn't happen.
- return new TextBody("");
+ if (!isDraft) {
+ // Place signature immediately after the quoted text
+ if (!(replyAfterQuote || signatureBeforeQuotedText)) {
+ text = appendSignature(text);
+ }
+ }
}
+
+ TextBody body = new TextBody(text);
+ body.setComposedMessageLength(composedMessageLength);
+ body.setComposedMessageOffset(composedMessageOffset);
+
+ return body;
}
/**
@@ -1027,6 +1177,11 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
message.setRecipients(RecipientType.CC, getAddresses(mCcView));
message.setRecipients(RecipientType.BCC, getAddresses(mBccView));
message.setSubject(mSubjectView.getText().toString());
+ if (mReadReceipt) {
+ message.setHeader("Disposition-Notification-To", from.toEncodedString());
+ message.setHeader("X-Confirm-Reading-To", from.toEncodedString());
+ message.setHeader("Return-Receipt-To", from.toEncodedString());
+ }
message.setHeader("User-Agent", getString(R.string.message_header_mua));
final String replyTo = mIdentity.getReplyTo();
@@ -1043,7 +1198,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
// Build the body.
- // TODO FIXME - body can be either an HTML or Text part, depending on whether we're in HTML mode or not. Should probably fix this so we don't mix up html and text parts.
+ // TODO FIXME - body can be either an HTML or Text part, depending on whether we're in
+ // HTML mode or not. Should probably fix this so we don't mix up html and text parts.
TextBody body = null;
if (mPgpData.getEncryptedData() != null) {
String text = mPgpData.getEncryptedData();
@@ -1052,6 +1208,9 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
body = buildText(isDraft);
}
+ // text/plain part when mMessageFormat == MessageFormat.HTML
+ TextBody bodyPlain = null;
+
final boolean hasAttachments = mAttachments.getChildCount() > 0;
if (mMessageFormat == MessageFormat.HTML) {
@@ -1061,7 +1220,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
MimeMultipart composedMimeMessage = new MimeMultipart();
composedMimeMessage.setSubType("alternative"); // Let the receiver select either the text or the HTML part.
composedMimeMessage.addBodyPart(new MimeBodyPart(body, "text/html"));
- composedMimeMessage.addBodyPart(new MimeBodyPart(new TextBody(HtmlConverter.htmlToText(body.getText())), "text/plain"));
+ bodyPlain = buildText(isDraft, MessageFormat.TEXT);
+ composedMimeMessage.addBodyPart(new MimeBodyPart(bodyPlain, "text/plain"));
if (hasAttachments) {
// If we're HTML and have attachments, we have a MimeMultipart container to hold the
@@ -1092,7 +1252,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
// If this is a draft, add metadata for thawing.
if (isDraft) {
// Add the identity to the message.
- message.addHeader(K9.IDENTITY_HEADER, buildIdentityHeader(body));
+ message.addHeader(K9.IDENTITY_HEADER, buildIdentityHeader(body, bodyPlain));
}
return message;
@@ -1139,9 +1299,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
*/
bp.addHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, String.format(
"attachment;\n filename=\"%s\";\n size=%d",
- EncoderUtil.encodeIfNecessary(attachment.name,
- EncoderUtil.Usage.WORD_ENTITY, 7),
- attachment.size));
+ attachment.name, attachment.size));
mp.addBodyPart(bp);
}
@@ -1152,14 +1310,19 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
private enum IdentityField {
LENGTH("l"),
OFFSET("o"),
+ FOOTER_OFFSET("fo"),
+ PLAIN_LENGTH("pl"),
+ PLAIN_OFFSET("po"),
MESSAGE_FORMAT("f"),
+ MESSAGE_READ_RECEIPT("r"),
SIGNATURE("s"),
NAME("n"),
EMAIL("e"),
// TODO - store a reference to the message being replied so we can mark it at the time of send.
ORIGINAL_MESSAGE("m"),
CURSOR_POSITION("p"), // Where in the message your cursor was when you saved.
- QUOTED_TEXT_MODE("q");
+ QUOTED_TEXT_MODE("q"),
+ QUOTE_STYLE("qs");
private final String value;
@@ -1172,12 +1335,16 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
/**
- * Get the list of IdentityFields that should be integer values. These values are sanity
- * checked for integer-ness during decoding.
- * @return
+ * Get the list of IdentityFields that should be integer values.
+ *
+ *
+ * These values are sanity checked for integer-ness during decoding.
+ *
+ *
+ * @return The list of integer {@link IdentityField}s.
*/
public static IdentityField[] getIntegerFields() {
- return new IdentityField[] { LENGTH, OFFSET };
+ return new IdentityField[] { LENGTH, OFFSET, FOOTER_OFFSET, PLAIN_LENGTH, PLAIN_OFFSET };
}
}
@@ -1192,9 +1359,10 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
*
* This is a URL-encoded key/value pair string. The list of possible values are in {@link IdentityField}.
* @param body {@link TextBody} to analyze for body length and offset.
+ * @param bodyPlain {@link TextBody} to analyze for body length and offset. May be null.
* @return Identity string.
*/
- private String buildIdentityHeader(final TextBody body) {
+ private String buildIdentityHeader(final TextBody body, final TextBody bodyPlain) {
Uri.Builder uri = new Uri.Builder();
if (body.getComposedMessageLength() != null && body.getComposedMessageOffset() != null) {
// See if the message body length is already in the TextBody.
@@ -1205,6 +1373,24 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
uri.appendQueryParameter(IdentityField.LENGTH.value(), Integer.toString(body.getText().length()));
uri.appendQueryParameter(IdentityField.OFFSET.value(), Integer.toString(0));
}
+ if (mQuotedHtmlContent != null) {
+ uri.appendQueryParameter(IdentityField.FOOTER_OFFSET.value(),
+ Integer.toString(mQuotedHtmlContent.getFooterInsertionPoint()));
+ }
+ if (bodyPlain != null) {
+ if (bodyPlain.getComposedMessageLength() != null && bodyPlain.getComposedMessageOffset() != null) {
+ // See if the message body length is already in the TextBody.
+ uri.appendQueryParameter(IdentityField.PLAIN_LENGTH.value(), bodyPlain.getComposedMessageLength().toString());
+ uri.appendQueryParameter(IdentityField.PLAIN_OFFSET.value(), bodyPlain.getComposedMessageOffset().toString());
+ } else {
+ // If not, calculate it now.
+ uri.appendQueryParameter(IdentityField.PLAIN_LENGTH.value(), Integer.toString(body.getText().length()));
+ uri.appendQueryParameter(IdentityField.PLAIN_OFFSET.value(), Integer.toString(0));
+ }
+ }
+ // Save the quote style (useful for forwards).
+ uri.appendQueryParameter(IdentityField.QUOTE_STYLE.value(), mQuoteStyle.name());
+
// Save the message format for this offset.
uri.appendQueryParameter(IdentityField.MESSAGE_FORMAT.value(), mMessageFormat.name());
@@ -1237,8 +1423,11 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
/**
* Parse an identity string. Handles both legacy and new (!) style identities.
+ *
* @param identityString
- * @return
+ * The encoded identity string that was saved in a drafts header.
+ *
+ * @return A map containing the value for each {@link IdentityField} in the identity string.
*/
private Map parseIdentityHeader(final String identityString) {
Map identity = new HashMap();
@@ -1309,7 +1498,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
- private String appendSignature(String text) {
+ private String appendSignature(String originalText) {
+ String text = originalText;
if (mIdentity.getSignatureUse()) {
String signature = mSignatureView.getText().toString();
@@ -1321,6 +1511,20 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
return text;
}
+ /**
+ * Get an HTML version of the signature in the #mSignatureView, if any.
+ * @return HTML version of signature.
+ */
+ private String getSignatureHtml() {
+ String signature = "";
+ if (mIdentity.getSignatureUse()) {
+ signature = mSignatureView.getText().toString();
+ if(!StringUtils.isNullOrEmpty(signature)) {
+ signature = HtmlConverter.textToHtmlFragment("\n" + signature);
+ }
+ }
+ return signature;
+ }
private void sendMessage() {
new SendMessageTask().execute();
@@ -1330,7 +1534,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
private void saveIfNeeded() {
- if (!mDraftNeedsSaving || mPreventDraftSaving || mPgpData.hasEncryptionKeys()) {
+ if (!mDraftNeedsSaving || mPreventDraftSaving || mPgpData.hasEncryptionKeys() ||
+ mEncryptCheckbox.isChecked() || isDraftsFolderDisabled()) {
return;
}
@@ -1360,28 +1565,29 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
Toast.makeText(this, getString(R.string.message_compose_error_no_recipients), Toast.LENGTH_LONG).show();
return;
}
+ final CryptoProvider crypto = mAccount.getCryptoProvider();
if (mEncryptCheckbox.isChecked() && !mPgpData.hasEncryptionKeys()) {
+ mMessageFormat = MessageFormat.TEXT;
// key selection before encryption
- String emails = "";
- Address[][] addresses = new Address[][] { getAddresses(mToView),
- getAddresses(mCcView),
- getAddresses(mBccView)
- };
- for (Address[] addressArray : addresses) {
- for (Address address : addressArray) {
- if (emails.length() != 0) {
- emails += ",";
- }
- emails += address.getAddress();
+ StringBuilder emails = new StringBuilder();
+ for (Address address : getRecipientAddresses()) {
+ if (emails.length() != 0) {
+ emails.append(',');
+ }
+ emails.append(address.getAddress());
+ if (!mContinueWithoutPublicKey &&
+ !crypto.hasPublicKeyForEmail(this, address.getAddress())) {
+ showDialog(DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY);
+ return;
}
}
if (emails.length() != 0) {
- emails += ",";
+ emails.append(',');
}
- emails += mIdentity.getEmail();
+ emails.append(mIdentity.getEmail());
mPreventDraftSaving = true;
- if (!mAccount.getCryptoProvider().selectEncryptionKeys(MessageCompose.this, emails, mPgpData)) {
+ if (!crypto.selectEncryptionKeys(MessageCompose.this, emails.toString(), mPgpData)) {
mPreventDraftSaving = false;
}
return;
@@ -1390,7 +1596,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
if (mPgpData.getEncryptedData() == null) {
String text = buildText(false).getText();
mPreventDraftSaving = true;
- if (!mAccount.getCryptoProvider().encrypt(this, text, mPgpData)) {
+ if (!crypto.encrypt(this, text, mPgpData)) {
mPreventDraftSaving = false;
}
return;
@@ -1405,7 +1611,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
final Account account = Preferences.getPreferences(this).getAccount(mMessageReference.accountUuid);
final String folderName = mMessageReference.folderName;
final String sourceMessageUid = mMessageReference.uid;
- MessagingController.getInstance(getApplication()).setFlag(account, folderName, new String[] {sourceMessageUid}, mMessageReference.flag, true);
+ MessagingController.getInstance(getApplication()).setFlag(account, folderName, sourceMessageUid, mMessageReference.flag, true);
}
mDraftNeedsSaving = false;
@@ -1413,9 +1619,9 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
private void onDiscard() {
- if (mDraftUid != null) {
- MessagingController.getInstance(getApplication()).deleteDraft(mAccount, mDraftUid);
- mDraftUid = null;
+ if (mDraftId != INVALID_DRAFT_ID) {
+ MessagingController.getInstance(getApplication()).deleteDraft(mAccount, mDraftId);
+ mDraftId = INVALID_DRAFT_ID;
}
mHandler.sendEmptyMessage(MSG_DISCARDED_DRAFT);
mDraftNeedsSaving = false;
@@ -1423,7 +1629,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
private void onSave() {
- mDraftNeedsSaving = true;
saveIfNeeded();
finish();
}
@@ -1433,6 +1638,19 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
mBccWrapper.setVisibility(View.VISIBLE);
}
+ private void onReadReceipt() {
+ CharSequence txt;
+ if (mReadReceipt == false) {
+ txt = getString(R.string.read_receipt_enabled);
+ mReadReceipt = true;
+ } else {
+ txt = getString(R.string.read_receipt_disabled);
+ mReadReceipt = false;
+ }
+ Context context = getApplicationContext();
+ Toast toast = Toast.makeText(context, txt, Toast.LENGTH_SHORT);
+ toast.show();
+ }
/**
* Kick off a picker for whatever kind of MIME types we'll accept and let Android take over.
*/
@@ -1454,6 +1672,9 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
/**
* Kick off a picker for the specified MIME type and let Android take over.
+ *
+ * @param mime_type
+ * The MIME type we want our attachment to have.
*/
private void onAddAttachment2(final String mime_type) {
if (mAccount.getCryptoProvider().isAvailable(this)) {
@@ -1462,6 +1683,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType(mime_type);
+ mIgnoreOnPause = true;
startActivityForResult(Intent.createChooser(i, null), ACTIVITY_REQUEST_PICK_ATTACHMENT);
}
@@ -1497,11 +1719,12 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
name = uri.getLastPathSegment();
}
- if ((contentType == null) || (contentType.indexOf('*') != -1)) {
- contentType = contentResolver.getType(uri);
+ String usableContentType = contentType;
+ if ((usableContentType == null) || (usableContentType.indexOf('*') != -1)) {
+ usableContentType = contentResolver.getType(uri);
}
- if (contentType == null) {
- contentType = MimeUtility.getMimeTypeByExtension(name);
+ if (usableContentType == null) {
+ usableContentType = MimeUtility.getMimeTypeByExtension(name);
}
if (size <= 0) {
@@ -1520,7 +1743,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
Attachment attachment = new Attachment();
attachment.uri = uri;
- attachment.contentType = contentType;
+ attachment.contentType = usableContentType;
attachment.name = name;
attachment.size = size;
@@ -1584,6 +1807,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
public void doLaunchContactPicker(int resultId) {
+ mIgnoreOnPause = true;
startActivityForResult(mContacts.contactPickerIntent(), resultId);
}
@@ -1607,12 +1831,12 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
// test whether there is something to save
- if (mDraftNeedsSaving || (mDraftUid != null)) {
- final String previousDraftUid = mDraftUid;
+ if (mDraftNeedsSaving || (mDraftId != INVALID_DRAFT_ID)) {
+ final long previousDraftId = mDraftId;
final Account previousAccount = mAccount;
// make current message appear as new
- mDraftUid = null;
+ mDraftId = INVALID_DRAFT_ID;
// actual account switch
mAccount = account;
@@ -1622,13 +1846,13 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
saveMessage();
- if (previousDraftUid != null) {
+ if (previousDraftId != INVALID_DRAFT_ID) {
if (K9.DEBUG) {
Log.v(K9.LOG_TAG, "Account switch, deleting draft from previous account: "
- + previousDraftUid);
+ + previousDraftId);
}
MessagingController.getInstance(getApplication()).deleteDraft(previousAccount,
- previousDraftUid);
+ previousDraftId);
}
} else {
mAccount = account;
@@ -1668,6 +1892,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
}
+ @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.attachment_delete:
@@ -1743,7 +1968,11 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
onSend();
break;
case R.id.save:
- onSave();
+ if (mEncryptCheckbox.isChecked()) {
+ showDialog(DIALOG_REFUSE_TO_SAVE_DRAFT_MARKED_ENCRYPTED);
+ } else {
+ onSave();
+ }
break;
case R.id.discard:
onDiscard();
@@ -1763,6 +1992,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
case R.id.choose_identity:
onChooseIdentity();
break;
+ case R.id.read_receipt:
+ onReadReceipt();
default:
return super.onOptionsItemSelected(item);
}
@@ -1772,6 +2003,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
private void onChooseIdentity() {
// keep things simple: trigger account choice only if there are more
// than 1 account
+ mIgnoreOnPause = true;
if (Preferences.getPreferences(this).getAvailableAccounts().size() > 1) {
final Intent intent = new Intent(this, ChooseAccount.class);
intent.putExtra(ChooseAccount.EXTRA_ACCOUNT, mAccount.getUuid());
@@ -1792,6 +2024,11 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.message_compose_option, menu);
+ // Disable the 'Save' menu option if Drafts folder is set to -NONE-
+ if (isDraftsFolderDisabled()) {
+ menu.findItem(R.id.save).setEnabled(false);
+ }
+
/*
* Show the menu items "Add attachment (Image)" and "Add attachment (Video)"
* if the work-around for the Gallery bug is enabled (see Issue 1186).
@@ -1815,16 +2052,28 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
@Override
public void onBackPressed() {
- // This will be called either automatically for you on 2.0
- // or later, or by the code above on earlier versions of the
- // platform.
if (mDraftNeedsSaving) {
- showDialog(DIALOG_SAVE_OR_DISCARD_DRAFT_MESSAGE);
+ if (mEncryptCheckbox.isChecked()) {
+ showDialog(DIALOG_REFUSE_TO_SAVE_DRAFT_MARKED_ENCRYPTED);
+ } else if (isDraftsFolderDisabled()) {
+ showDialog(DIALOG_CONFIRM_DISCARD_ON_BACK);
+ } else {
+ showDialog(DIALOG_SAVE_OR_DISCARD_DRAFT_MESSAGE);
+ }
} else {
- finish();
+ // Check if editing an existing draft.
+ if (mDraftId == INVALID_DRAFT_ID) {
+ onDiscard();
+ } else {
+ super.onBackPressed();
+ }
}
}
+ private boolean isDraftsFolderDisabled() {
+ return mAccount.getDraftsFolderName().equals(K9.FOLDER_NONE);
+ }
+
@Override
public Dialog onCreateDialog(int id) {
switch (id) {
@@ -1833,42 +2082,89 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
.setTitle(R.string.save_or_discard_draft_message_dlg_title)
.setMessage(R.string.save_or_discard_draft_message_instructions_fmt)
.setPositiveButton(R.string.save_draft_action, new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int whichButton) {
dismissDialog(DIALOG_SAVE_OR_DISCARD_DRAFT_MESSAGE);
onSave();
}
})
.setNegativeButton(R.string.discard_action, new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int whichButton) {
dismissDialog(DIALOG_SAVE_OR_DISCARD_DRAFT_MESSAGE);
onDiscard();
}
})
.create();
+ case DIALOG_REFUSE_TO_SAVE_DRAFT_MARKED_ENCRYPTED:
+ return new AlertDialog.Builder(this)
+ .setTitle(R.string.refuse_to_save_draft_marked_encrypted_dlg_title)
+ .setMessage(R.string.refuse_to_save_draft_marked_encrypted_instructions_fmt)
+ .setNeutralButton(R.string.okay_action, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dismissDialog(DIALOG_REFUSE_TO_SAVE_DRAFT_MARKED_ENCRYPTED);
+ }
+ })
+ .create();
+ case DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY:
+ return new AlertDialog.Builder(this)
+ .setTitle(R.string.continue_without_public_key_dlg_title)
+ .setMessage(R.string.continue_without_public_key_instructions_fmt)
+ .setPositiveButton(R.string.continue_action, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dismissDialog(DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY);
+ mContinueWithoutPublicKey = true;
+ onSend();
+ }
+ })
+ .setNegativeButton(R.string.back_action, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dismissDialog(DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY);
+ mContinueWithoutPublicKey = false;
+ }
+ })
+ .create();
+ case DIALOG_CONFIRM_DISCARD_ON_BACK:
+ return new AlertDialog.Builder(this)
+ .setTitle(R.string.confirm_discard_draft_message_title)
+ .setMessage(R.string.confirm_discard_draft_message)
+ .setPositiveButton(R.string.cancel_action, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dismissDialog(DIALOG_CONFIRM_DISCARD_ON_BACK);
+ }
+ })
+ .setNegativeButton(R.string.discard_action, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dismissDialog(DIALOG_CONFIRM_DISCARD_ON_BACK);
+ Toast.makeText(MessageCompose.this,
+ getString(R.string.message_discarded_toast),
+ Toast.LENGTH_LONG).show();
+ onDiscard();
+ }
+ })
+ .create();
}
return super.onCreateDialog(id);
}
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (
- // TODO - when we move to android 2.0, uncomment this.
- // android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR &&
-
- keyCode == KeyEvent.KEYCODE_BACK
- && event.getRepeatCount() == 0
- && K9.manageBack()) {
- // Take care of calling this method on earlier versions of
- // the platform where it doesn't exist.
- onBackPressed();
- return true;
- }
-
- return super.onKeyDown(keyCode, event);
- }
-
/**
- * Returns true if all attachments were able to be attached, otherwise returns false.
+ * Add all attachments of an existing message as if they were added by hand.
+ *
+ * @param part
+ * The message part to check for being an attachment. This method will recurse if it's
+ * a multipart part.
+ * @param depth
+ * The recursion depth. Currently unused.
+ *
+ * @return {@code true} if all attachments were able to be attached, {@code false} otherwise.
+ *
+ * @throws MessagingException
+ * In case of an error
*/
private boolean loadAttachments(Part part, int depth) throws MessagingException {
if (part.getBody() instanceof Multipart) {
@@ -1880,24 +2176,25 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
}
return ret;
- } else {
- String contentType = MimeUtility.unfoldAndDecode(part.getContentType());
- String name = MimeUtility.getHeaderParameter(contentType, "name");
- if (name != null) {
- Body body = part.getBody();
- if (body != null && body instanceof LocalAttachmentBody) {
- final Uri uri = ((LocalAttachmentBody) body).getContentUri();
- mHandler.post(new Runnable() {
- public void run() {
- addAttachment(uri);
- }
- });
- } else {
- return false;
- }
- }
- return true;
}
+
+ String contentType = MimeUtility.unfoldAndDecode(part.getContentType());
+ String name = MimeUtility.getHeaderParameter(contentType, "name");
+ if (name != null) {
+ Body body = part.getBody();
+ if (body != null && body instanceof LocalAttachmentBody) {
+ final Uri uri = ((LocalAttachmentBody) body).getContentUri();
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ addAttachment(uri);
+ }
+ });
+ } else {
+ return false;
+ }
+ }
+ return true;
}
/**
@@ -1910,9 +2207,9 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
try {
if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action)) {
if (message.getSubject() != null) {
- final String subject = prefix.matcher(message.getSubject()).replaceFirst("");
+ final String subject = PREFIX.matcher(message.getSubject()).replaceFirst("");
- if (!subject.toLowerCase().startsWith("re:")) {
+ if (!subject.toLowerCase(Locale.US).startsWith("re:")) {
mSubjectView.setText("Re: " + subject);
} else {
mSubjectView.setText(subject);
@@ -1946,7 +2243,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
mInReplyTo = message.getMessageId();
if (message.getReferences() != null && message.getReferences().length > 0) {
- StringBuffer buffy = new StringBuffer();
+ StringBuilder buffy = new StringBuilder();
for (int i = 0; i < message.getReferences().length; i++)
buffy.append(message.getReferences()[i]);
@@ -2005,15 +2302,17 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
}
- mCcView.setVisibility(View.VISIBLE);
+ mCcWrapper.setVisibility(View.VISIBLE);
}
}
} else if (ACTION_FORWARD.equals(action)) {
- if (message.getSubject() != null && !message.getSubject().toLowerCase().startsWith("fwd:")) {
- mSubjectView.setText("Fwd: " + message.getSubject());
+ String subject = message.getSubject();
+ if (subject != null && !subject.toLowerCase(Locale.US).startsWith("fwd:")) {
+ mSubjectView.setText("Fwd: " + subject);
} else {
- mSubjectView.setText(message.getSubject());
+ mSubjectView.setText(subject);
}
+ mQuoteStyle = QuoteStyle.HEADER;
// Quote the message and setup the UI.
populateUIWithQuotedMessage(true);
@@ -2026,12 +2325,12 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
} else if (ACTION_EDIT_DRAFT.equals(action)) {
String showQuotedTextMode = "NONE";
- mDraftUid = message.getUid();
+ mDraftId = MessagingController.getInstance(getApplication()).getId(message);
mSubjectView.setText(message.getSubject());
addAddresses(mToView, message.getRecipients(RecipientType.TO));
if (message.getRecipients(RecipientType.CC).length > 0) {
addAddresses(mCcView, message.getRecipients(RecipientType.CC));
- mCcView.setVisibility(View.VISIBLE);
+ mCcWrapper.setVisibility(View.VISIBLE);
}
Address[] bccRecipients = message.getRecipients(RecipientType.BCC);
@@ -2040,9 +2339,9 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
String bccAddress = mAccount.getAlwaysBcc();
if (bccRecipients.length == 1 && bccAddress != null && bccAddress.equals(bccRecipients[0].toString())) {
// If the auto-bcc is the only entry in the BCC list, don't show the Bcc fields.
- mBccView.setVisibility(View.GONE);
+ mBccWrapper.setVisibility(View.GONE);
} else {
- mBccView.setVisibility(View.VISIBLE);
+ mBccWrapper.setVisibility(View.VISIBLE);
}
}
@@ -2126,6 +2425,19 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
Integer bodyOffset = k9identity.get(IdentityField.OFFSET) != null
? Integer.parseInt(k9identity.get(IdentityField.OFFSET))
: 0;
+ Integer bodyFooterOffset = k9identity.get(IdentityField.FOOTER_OFFSET) != null
+ ? Integer.parseInt(k9identity.get(IdentityField.FOOTER_OFFSET))
+ : null;
+ Integer bodyPlainLength = k9identity.get(IdentityField.PLAIN_LENGTH) != null
+ ? Integer.parseInt(k9identity.get(IdentityField.PLAIN_LENGTH))
+ : null;
+ Integer bodyPlainOffset = k9identity.get(IdentityField.PLAIN_OFFSET) != null
+ ? Integer.parseInt(k9identity.get(IdentityField.PLAIN_OFFSET))
+ : null;
+ mQuoteStyle = k9identity.get(IdentityField.QUOTE_STYLE) != null
+ ? QuoteStyle.valueOf(k9identity.get(IdentityField.QUOTE_STYLE))
+ : mAccount.getQuoteStyle();
+
// Always respect the user's current composition format preference, even if the
// draft was saved in a different format.
// TODO - The current implementation doesn't allow a user in HTML mode to edit a draft that wasn't saved with K9mail.
@@ -2163,26 +2475,21 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
if (quotedHTML.length() > 0) {
mQuotedHtmlContent = new InsertableHtmlContent();
mQuotedHtmlContent.setQuotedContent(quotedHTML);
+ // We don't know if bodyOffset refers to the header or to the footer
mQuotedHtmlContent.setHeaderInsertionPoint(bodyOffset);
+ if (bodyFooterOffset != null) {
+ mQuotedHtmlContent.setFooterInsertionPoint(bodyFooterOffset);
+ } else {
+ mQuotedHtmlContent.setFooterInsertionPoint(bodyOffset);
+ }
mQuotedHTML.loadDataWithBaseURL("http://", mQuotedHtmlContent.getQuotedContent(), "text/html", "utf-8", null);
}
}
- } else if (mMessageFormat == MessageFormat.TEXT) {
- Part textPart = MimeUtility.findFirstPartByMimeType(message, "text/plain");
- if (textPart != null) {
- String text = MimeUtility.getTextFromPart(textPart);
- // If we had a body length (and it was valid), separate the composition from the quoted text
- // and put them in their respective places in the UI.
- if (bodyLength != null && bodyLength + 1 < text.length()) { // + 1 to get rid of the newline we added when saving the draft
- String bodyText = text.substring(0, bodyLength);
- String quotedText = text.substring(bodyLength + 1, text.length());
-
- mMessageContentView.setText(bodyText);
- mQuotedText.setText(quotedText);
- } else {
- mMessageContentView.setText(text);
- }
+ if (bodyPlainOffset != null && bodyPlainLength != null) {
+ processSourceMessageText(message, bodyPlainOffset, bodyPlainLength, false);
}
+ } else if (mMessageFormat == MessageFormat.TEXT) {
+ processSourceMessageText(message, bodyOffset, bodyLength, true);
} else {
Log.e(K9.LOG_TAG, "Unhandled message format.");
}
@@ -2208,11 +2515,72 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
}
- /**
- * Build and populate the UI with the quoted message.
+ /*
+ * Pull out the parts of the now loaded source message and apply them to the new message
+ * depending on the type of message being composed.
+ * @param message Source message
+ * @param bodyOffset Insertion point for reply.
+ * @param bodyLength Length of reply.
+ * @param viewMessageContent Update mMessageContentView or not.
* @throws MessagingException
*/
- private void populateUIWithQuotedMessage(boolean shown) throws MessagingException {
+ private void processSourceMessageText(Message message, Integer bodyOffset, Integer bodyLength,
+ boolean viewMessageContent) throws MessagingException {
+ Part textPart = MimeUtility.findFirstPartByMimeType(message, "text/plain");
+ if (textPart != null) {
+ String text = MimeUtility.getTextFromPart(textPart);
+ if (K9.DEBUG) {
+ Log.d(K9.LOG_TAG, "Loading message with offset " + bodyOffset + ", length " + bodyLength + ". Text length is " + text.length() + ".");
+ }
+
+ // If we had a body length (and it was valid), separate the composition from the quoted text
+ // and put them in their respective places in the UI.
+ if (bodyLength != null && bodyLength + 1 < text.length()) { // + 1 to get rid of the newline we added when saving the draft
+ String bodyText = text.substring(bodyOffset, bodyOffset + bodyLength);
+
+ // Regenerate the quoted text without our user content in it nor added newlines.
+ StringBuilder quotedText = new StringBuilder();
+ if (bodyOffset == 0 && text.substring(bodyLength, bodyLength + 2).equals("\n\n")) {
+ // top-posting: ignore two newlines at start of quote
+ quotedText.append(text.substring(bodyLength + 2));
+ } else if (bodyOffset + bodyLength == text.length() &&
+ text.substring(bodyOffset - 1, bodyOffset).equals("\n")) {
+ // bottom-posting: ignore newline at end of quote
+ quotedText.append(text.substring(0, bodyOffset - 1));
+ } else {
+ quotedText.append(text.substring(0, bodyOffset)); // stuff before the reply
+ quotedText.append(text.substring(bodyOffset + bodyLength));
+ }
+
+ if (viewMessageContent) mMessageContentView.setText(bodyText);
+ mQuotedText.setText(quotedText.toString());
+ } else {
+ if (viewMessageContent) mMessageContentView.setText(text);
+ }
+ }
+ }
+
+ // Regexes to check for signature.
+ private static final Pattern DASH_SIGNATURE_PLAIN = Pattern.compile("\r\n-- \r\n.*", Pattern.DOTALL);
+ private static final Pattern DASH_SIGNATURE_HTML = Pattern.compile("( |\r?\n)-- ", Pattern.CASE_INSENSITIVE);
+ private static final Pattern BLOCKQUOTE_START = Pattern.compile("
", Pattern.CASE_INSENSITIVE);
+
+ /**
+ * Build and populate the UI with the quoted message.
+ *
+ * @param showQuotedText
+ * {@code true} if the quoted text should be shown, {@code false} otherwise.
+ *
+ * @throws MessagingException
+ */
+ private void populateUIWithQuotedMessage(boolean showQuotedText) throws MessagingException {
+ if (mMessageFormat == MessageFormat.AUTO) {
+ mMessageFormat = MimeUtility.findFirstPartByMimeType(mSourceMessage, "text/html") == null
+ ? MessageFormat.TEXT
+ : MessageFormat.HTML;
+ }
+
// TODO -- I am assuming that mSourceMessageBody will always be a text part. Is this a safe assumption?
// Handle the original message in the reply
@@ -2221,16 +2589,97 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
? mSourceMessageBody
: getBodyTextFromMessage(mSourceMessage, mMessageFormat);
if (mMessageFormat == MessageFormat.HTML) {
+ // Strip signature.
+ // closing tags such as , , , will be cut off.
+ if (mAccount.isStripSignature() && (ACTION_REPLY_ALL.equals(getIntent().getAction()) ||
+ ACTION_REPLY.equals(getIntent().getAction()))) {
+ Matcher dashSignatureHtml = DASH_SIGNATURE_HTML.matcher(content);
+ if (dashSignatureHtml.find()) {
+ Matcher blockquoteStart = BLOCKQUOTE_START.matcher(content);
+ Matcher blockquoteEnd = BLOCKQUOTE_END.matcher(content);
+ List start = new ArrayList();
+ List end = new ArrayList();
+
+ while(blockquoteStart.find()) {
+ start.add(blockquoteStart.start());
+ }
+ while(blockquoteEnd.find()) {
+ end.add(blockquoteEnd.start());
+ }
+ if (start.size() != end.size()) {
+ Log.d(K9.LOG_TAG, "There are " + start.size() + "
tags, but " +
+ end.size() + "
tags. Refusing to strip.");
+ } else if (start.size() > 0) {
+ // Ignore quoted signatures in blockquotes.
+ dashSignatureHtml.region(0, start.get(0));
+ if (dashSignatureHtml.find()) {
+ // before first
.
+ content = content.substring(0, dashSignatureHtml.start());
+ } else {
+ for (int i = 0; i < start.size() - 1; i++) {
+ // within blockquotes.
+ if (end.get(i) < start.get(i+1)) {
+ dashSignatureHtml.region(end.get(i), start.get(i+1));
+ if (dashSignatureHtml.find()) {
+ content = content.substring(0, dashSignatureHtml.start());
+ break;
+ }
+ }
+ }
+ if (end.get(end.size() - 1) < content.length()) {
+ // after last
.
+ dashSignatureHtml.region(end.get(end.size() - 1), content.length());
+ if (dashSignatureHtml.find()) {
+ content = content.substring(0, dashSignatureHtml.start());
+ }
+ }
+ }
+ } else {
+ // No blockquotes found.
+ content = content.substring(0, dashSignatureHtml.start());
+ }
+ }
+
+ // Fix the stripping off of closing tags if a signature was stripped,
+ // as well as clean up the HTML of the quoted message.
+ HtmlCleaner cleaner = new HtmlCleaner();
+ CleanerProperties properties = cleaner.getProperties();
+
+ // see http://htmlcleaner.sourceforge.net/parameters.php for descriptions
+ properties.setNamespacesAware(false);
+ properties.setAdvancedXmlEscape(false);
+ properties.setOmitXmlDeclaration(true);
+ properties.setOmitDoctypeDeclaration(false);
+ properties.setTranslateSpecialEntities(false);
+ properties.setRecognizeUnicodeChars(false);
+
+ TagNode node = cleaner.clean(content);
+ SimpleHtmlSerializer htmlSerialized = new SimpleHtmlSerializer(properties);
+ try {
+ content = htmlSerialized.getAsString(node, "UTF8");
+ } catch (java.io.IOException ioe) {
+ // Can't imagine this happening.
+ Log.e(K9.LOG_TAG, "Problem cleaning quoted message.", ioe);
+ }
+ }
// Add the HTML reply header to the top of the content.
- mQuotedHtmlContent = quoteOriginalHtmlMessage(mSourceMessage, content, mAccount.getQuoteStyle());
+ mQuotedHtmlContent = quoteOriginalHtmlMessage(mSourceMessage, content, mQuoteStyle);
// Load the message with the reply header.
mQuotedHTML.loadDataWithBaseURL("http://", mQuotedHtmlContent.getQuotedContent(), "text/html", "utf-8", null);
+ mQuotedText.setText(quoteOriginalTextMessage(mSourceMessage,
+ getBodyTextFromMessage(mSourceMessage, MessageFormat.TEXT), mQuoteStyle));
} else if (mMessageFormat == MessageFormat.TEXT) {
- mQuotedText.setText(quoteOriginalTextMessage(mSourceMessage, content, mAccount.getQuoteStyle()));
+ if (mAccount.isStripSignature() && (ACTION_REPLY_ALL.equals(getIntent().getAction()) ||
+ ACTION_REPLY.equals(getIntent().getAction()))) {
+ if (DASH_SIGNATURE_PLAIN.matcher(content).find()) {
+ content = DASH_SIGNATURE_PLAIN.matcher(content).replaceFirst("\r\n");
+ }
+ }
+ mQuotedText.setText(quoteOriginalTextMessage(mSourceMessage, content, mQuoteStyle));
}
- if (shown) {
+ if (showQuotedText) {
showOrHideQuotedText(QuotedTextMode.SHOW);
} else {
showOrHideQuotedText(QuotedTextMode.HIDE);
@@ -2438,6 +2887,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
mSourceMessage = message;
runOnUiThread(new Runnable() {
+ @Override
public void run() {
// We check to see if we've previously processed the source message since this
// could be called when switching from HTML to text replies. If that happens, we
@@ -2470,14 +2920,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
@Override
public void messageUidChanged(Account account, String folder, String oldUid, String newUid) {
- //TODO: is this really necessary here? mDraftUid is update after the call to MessagingController.saveDraft()
- // Track UID changes of the draft message
- if (account.equals(mAccount) &&
- folder.equals(mAccount.getDraftsFolderName()) &&
- oldUid.equals(mDraftUid)) {
- mDraftUid = newUid;
- }
-
// Track UID changes of the source message
if (mMessageReference != null) {
final Account sourceAccount = Preferences.getPreferences(MessageCompose.this).getAccount(mMessageReference.accountUuid);
@@ -2499,6 +2941,9 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
/**
* When we are launched with an intent that includes a mailto: URI, we can actually
* gather quite a few of our message fields from it.
+ *
+ * @param mailtoUri
+ * The mailto: URI we use to initialize the message fields.
*/
private void initializeFromMailto(Uri mailtoUri) {
String schemaSpecific = mailtoUri.getSchemeSpecificPart();
@@ -2539,13 +2984,13 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
// Read subject from the "subject" parameter.
List subject = uri.getQueryParameters("subject");
- if (subject.size() > 0) {
+ if (!subject.isEmpty()) {
mSubjectView.setText(subject.get(0));
}
// Read message body from the "body" parameter.
List body = uri.getQueryParameters("body");
- if (body.size() > 0) {
+ if (!body.isEmpty()) {
mMessageContentView.setText(body.get(0));
}
}
@@ -2573,9 +3018,10 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
MessagingController.getInstance(getApplication()).sendMessage(mAccount, message, null);
- if (mDraftUid != null) {
- MessagingController.getInstance(getApplication()).deleteDraft(mAccount, mDraftUid);
- mDraftUid = null;
+ long draftId = mDraftId;
+ if (draftId != INVALID_DRAFT_ID) {
+ mDraftId = INVALID_DRAFT_ID;
+ MessagingController.getInstance(getApplication()).deleteDraft(mAccount, draftId);
}
return null;
@@ -2585,7 +3031,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
private class SaveMessageTask extends AsyncTask {
@Override
protected Void doInBackground(Void... params) {
-
/*
* Create the message from all the data the user has entered.
*/
@@ -2600,9 +3045,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
/*
* Save a draft
*/
- if (mDraftUid != null) {
- message.setUid(mDraftUid);
- } else if (ACTION_EDIT_DRAFT.equals(getIntent().getAction())) {
+ if (ACTION_EDIT_DRAFT.equals(getIntent().getAction())) {
/*
* We're saving a previously saved draft, so update the new message's uid
* to the old message's uid.
@@ -2613,13 +3056,10 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
}
final MessagingController messagingController = MessagingController.getInstance(getApplication());
- Message draftMessage = messagingController.saveDraft(mAccount, message);
- mDraftUid = draftMessage.getUid();
+ Message draftMessage = messagingController.saveDraft(mAccount, message, mDraftId);
+ mDraftId = messagingController.getId(draftMessage);
- // Don't display the toast if the user is just changing the orientation
- if ((getChangingConfigurations() & ActivityInfo.CONFIG_ORIENTATION) == 0) {
- mHandler.sendEmptyMessage(MSG_SAVED_DRAFT);
- }
+ mHandler.sendEmptyMessage(MSG_SAVED_DRAFT);
return null;
}
}
diff --git a/src/com/fsck/k9/activity/MessageList.java b/src/com/fsck/k9/activity/MessageList.java
index 8e902223c..867fb53fe 100644
--- a/src/com/fsck/k9/activity/MessageList.java
+++ b/src/com/fsck/k9/activity/MessageList.java
@@ -18,14 +18,13 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
+import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.util.Log;
import android.util.TypedValue;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
-import android.view.animation.Animation.AnimationListener;
import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -33,44 +32,48 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.GestureDetector.SimpleOnGestureListener;
-import android.view.View.OnClickListener;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
-import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.CompoundButton.OnCheckedChangeListener;
import com.fsck.k9.Account;
import com.fsck.k9.AccountStats;
+import com.fsck.k9.BaseAccount;
import com.fsck.k9.FontSizes;
import com.fsck.k9.K9;
import com.fsck.k9.Preferences;
import com.fsck.k9.R;
+import com.fsck.k9.SearchAccount;
import com.fsck.k9.SearchSpecification;
import com.fsck.k9.activity.setup.AccountSettings;
import com.fsck.k9.activity.setup.FolderSettings;
import com.fsck.k9.activity.setup.Prefs;
import com.fsck.k9.controller.MessagingController;
-import com.fsck.k9.controller.MessagingListener;
import com.fsck.k9.controller.MessagingController.SORT_TYPE;
+import com.fsck.k9.controller.MessagingListener;
import com.fsck.k9.helper.MessageHelper;
import com.fsck.k9.helper.Utility;
import com.fsck.k9.mail.Flag;
import com.fsck.k9.mail.Folder;
import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.store.LocalStore;
-import com.fsck.k9.mail.store.StorageManager;
import com.fsck.k9.mail.store.LocalStore.LocalFolder;
+import com.fsck.k9.mail.store.LocalStore.LocalMessage;
+import com.fsck.k9.mail.store.StorageManager;
/**
@@ -207,8 +210,6 @@ public class MessageList
private static final int ACTIVITY_CHOOSE_FOLDER_MOVE = 1;
private static final int ACTIVITY_CHOOSE_FOLDER_COPY = 2;
- private static final int ACTIVITY_CHOOSE_FOLDER_MOVE_BATCH = 3;
- private static final int ACTIVITY_CHOOSE_FOLDER_COPY_BATCH = 4;
private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_FOLDER = "folder";
@@ -220,6 +221,7 @@ public class MessageList
private static final String EXTRA_FOLDER_NAMES = "folderNames";
private static final String EXTRA_TITLE = "title";
private static final String EXTRA_LIST_POSITION = "listPosition";
+ private static final String EXTRA_RETURN_FROM_MESSAGE_VIEW = "returnFromMessageView";
/**
* Maps a {@link SORT_TYPE} to a {@link Comparator} implementation.
@@ -298,9 +300,21 @@ public class MessageList
private FontSizes mFontSizes = K9.getFontSizes();
private Bundle mState = null;
- private MessageInfoHolder mSelectedMessage = null;
- private Context context = null;
+ /**
+ * Remember the selection to be consistent between menu display and menu item
+ * selection
+ */
+ private MessageInfoHolder mSelectedMessage;
+
+ /**
+ * Relevant messages for the current context when we have to remember the
+ * chosen messages between user interactions (eg. Selecting a folder for
+ * move operation)
+ */
+ private List mActiveMessages;
+
+ private Context context;
/* package visibility for faster inner class access */
MessageHelper mMessageHelper = MessageHelper.getInstance(this);
@@ -327,8 +341,15 @@ public class MessageList
}
class MessageListHandler {
- public void removeMessage(final List messages) {
+ /**
+ * @param messages Never {@code null}.
+ */
+ public void removeMessages(final List messages) {
+ if (messages.isEmpty()) {
+ return;
+ }
runOnUiThread(new Runnable() {
+ @Override
public void run() {
for (MessageInfoHolder message : messages) {
if (message != null) {
@@ -348,9 +369,16 @@ public class MessageList
});
}
+ /**
+ * @param messages Never {@code null}.
+ */
public void addMessages(final List messages) {
+ if (messages.isEmpty()) {
+ return;
+ }
final boolean wasEmpty = mAdapter.messages.isEmpty();
runOnUiThread(new Runnable() {
+ @Override
public void run() {
for (final MessageInfoHolder message : messages) {
if (mFolderName == null || (message.folder != null && message.folder.name.equals(mFolderName))) {
@@ -379,6 +407,7 @@ public class MessageList
private void resetUnreadCount() {
runOnUiThread(new Runnable() {
+ @Override
public void run() {
resetUnreadCountOnThread();
}
@@ -402,6 +431,7 @@ public class MessageList
final Comparator chainComparator = getComparator();
runOnUiThread(new Runnable() {
+ @Override
public void run() {
synchronized (mAdapter.messages) {
Collections.sort(mAdapter.messages, chainComparator);
@@ -459,6 +489,7 @@ public class MessageList
private void refreshTitle() {
runOnUiThread(new Runnable() {
+ @Override
public void run() {
refreshTitleOnThread();
}
@@ -512,6 +543,7 @@ public class MessageList
public void progress(final boolean progress) {
runOnUiThread(new Runnable() {
+ @Override
public void run() {
showProgressIndicator(progress);
}
@@ -519,6 +551,36 @@ public class MessageList
}
}
+ /**
+ * Show the message list that was used to open the {@link MessageView} for a message.
+ *
+ *
+ * Note:
+ * The {@link MessageList} instance should still be around and all we do is bring it back to
+ * the front (see the activity flags).
+ * Out of sheer paranoia we also set the extras that were used to create the original
+ * {@code MessageList} instance. Using those, the activity can be recreated in the unlikely
+ * case of it having been killed by the OS.
+ *
+ *
+ * @param context
+ * The {@link Context} instance to invoke the {@link Context#startActivity(Intent)}
+ * method on.
+ * @param extras
+ * The extras used to create the original {@code MessageList} instance.
+ *
+ * @see MessageView#actionView(Context, MessageReference, ArrayList, Bundle)
+ */
+ public static void actionHandleFolder(Context context, Bundle extras) {
+ Intent intent = new Intent(context, MessageList.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ intent.putExtras(extras);
+ intent.putExtra(EXTRA_RETURN_FROM_MESSAGE_VIEW, true);
+ context.startActivity(intent);
+ }
+
public static void actionHandleFolder(Context context, Account account, String folder) {
Intent intent = actionHandleFolderIntent(context, account, folder);
context.startActivity(intent);
@@ -526,6 +588,9 @@ public class MessageList
public static Intent actionHandleFolderIntent(Context context, Account account, String folder) {
Intent intent = new Intent(context, MessageList.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra(EXTRA_ACCOUNT, account.getUuid());
if (folder != null) {
@@ -545,10 +610,17 @@ public class MessageList
}
intent.putExtra(EXTRA_INTEGRATE, integrate);
intent.putExtra(EXTRA_TITLE, title);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
}
- public static void actionHandle(Context context, String title, SearchSpecification searchSpecification) {
+ /**
+ * Creates and returns an intent that opens Unified Inbox or All Messages screen.
+ */
+ public static Intent actionHandleAccountIntent(Context context, String title,
+ SearchSpecification searchSpecification) {
Intent intent = new Intent(context, MessageList.class);
intent.putExtra(EXTRA_QUERY, searchSpecification.getQuery());
if (searchSpecification.getRequiredFlags() != null) {
@@ -561,6 +633,16 @@ public class MessageList
intent.putExtra(EXTRA_ACCOUNT_UUIDS, searchSpecification.getAccountUuids());
intent.putExtra(EXTRA_FOLDER_NAMES, searchSpecification.getFolderNames());
intent.putExtra(EXTRA_TITLE, title);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+
+ return intent;
+ }
+
+ public static void actionHandle(Context context, String title,
+ SearchSpecification searchSpecification) {
+ Intent intent = actionHandleAccountIntent(context, title, searchSpecification);
context.startActivity(intent);
}
@@ -577,7 +659,7 @@ public class MessageList
if (mSelectedCount > 0) {
// In multiselect mode make sure that clicking on the item results
// in toggling the 'selected' checkbox.
- setSelected(message, !message.selected);
+ setSelected(Collections.singletonList(message), !message.selected);
} else {
onOpenMessage(message);
}
@@ -590,22 +672,33 @@ public class MessageList
mInflater = getLayoutInflater();
initializeLayout();
- onNewIntent(getIntent());
- }
-
- @Override
- public void onNewIntent(Intent intent) {
- setIntent(intent); // onNewIntent doesn't autoset our "internal" intent
// Only set "touchable" when we're first starting up the activity.
// Otherwise we get force closes when the user toggles it midstream.
mTouchView = K9.messageListTouchable();
mPreviewLines = K9.messageListPreviewLines();
+ initializeMessageList(getIntent(), true);
+ }
+
+ @Override
+ public void onNewIntent(Intent intent) {
+ setIntent(intent); // onNewIntent doesn't autoset our "internal" intent
+ initializeMessageList(intent, false);
+ }
+
+ private void initializeMessageList(Intent intent, boolean create) {
+ boolean returnFromMessageView = intent.getBooleanExtra(
+ EXTRA_RETURN_FROM_MESSAGE_VIEW, false);
+
+ if (!create && returnFromMessageView) {
+ // We're returning from the MessageView activity with "Manage back button" enabled.
+ // So just leave the activity in the state it was left in.
+ return;
+ }
+
String accountUuid = intent.getStringExtra(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
- mFolderName = intent.getStringExtra(EXTRA_FOLDER);
- mQueryString = intent.getStringExtra(EXTRA_QUERY);
if (mAccount != null && !mAccount.isAvailable(this)) {
Log.i(K9.LOG_TAG, "not opening MessageList of unavailable account");
@@ -613,6 +706,9 @@ public class MessageList
return;
}
+ mFolderName = intent.getStringExtra(EXTRA_FOLDER);
+ mQueryString = intent.getStringExtra(EXTRA_QUERY);
+
String queryFlags = intent.getStringExtra(EXTRA_QUERY_FLAGS);
if (queryFlags != null) {
String[] flagStrings = queryFlags.split(",");
@@ -647,16 +743,19 @@ public class MessageList
mCurrentFolder = mAdapter.getFolder(mFolderName, mAccount);
}
+ // Hide "Load up to x more" footer for search views
+ mFooterView.setVisibility((mQueryString != null) ? View.GONE : View.VISIBLE);
+
mController = MessagingController.getInstance(getApplication());
mListView.setAdapter(mAdapter);
}
- @SuppressWarnings("unchecked")
private void restorePreviousData() {
- final Object previousData = getLastNonConfigurationInstance();
+ final ActivityState previousData = getLastNonConfigurationInstance();
if (previousData != null) {
- mAdapter.messages.addAll((List) previousData);
+ mAdapter.messages.addAll(previousData.messages);
+ mActiveMessages = previousData.activeMessages;
}
}
@@ -715,9 +814,17 @@ public class MessageList
sortDateAscending = mController.isSortAscending(SORT_TYPE.SORT_DATE);
mController.addListener(mAdapter.mListener);
+
+ Account[] accountsWithNotification;
if (mAccount != null) {
- mController.notifyAccountCancel(this, mAccount);
- MessagingController.getInstance(getApplication()).notifyAccountCancel(this, mAccount);
+ accountsWithNotification = new Account[] { mAccount };
+ } else {
+ Preferences preferences = Preferences.getPreferences(this);
+ accountsWithNotification = preferences.getAccounts();
+ }
+
+ for (Account accountWithNotification : accountsWithNotification) {
+ mController.notifyAccountCancel(this, accountWithNotification);
}
if (mAdapter.messages.isEmpty()) {
@@ -745,6 +852,7 @@ public class MessageList
mAdapter.pruneDirtyMessages();
runOnUiThread(new Runnable() {
+ @Override
public void run() {
mAdapter.notifyDataSetChanged();
restoreListState();
@@ -771,7 +879,7 @@ public class MessageList
mListView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_INSET);
mListView.setLongClickable(true);
mListView.setFastScrollEnabled(true);
- mListView.setScrollingCacheEnabled(true);
+ mListView.setScrollingCacheEnabled(false);
mListView.setOnItemClickListener(this);
mListView.addFooterView(getFooterView(mListView));
@@ -789,8 +897,9 @@ public class MessageList
mBatchDoneButton.setOnClickListener(this);
// Gesture detection
- gestureDetector = new GestureDetector(new MyGestureDetector());
+ gestureDetector = new GestureDetector(new MyGestureDetector(true));
gestureListener = new View.OnTouchListener() {
+ @Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
@@ -802,16 +911,49 @@ public class MessageList
mListView.setOnTouchListener(gestureListener);
}
+ /**
+ * Container for values to be kept while the device configuration is
+ * modified at runtime (keyboard, orientation, etc.) and Android restarts
+ * this activity.
+ *
+ * @see MessageList#onRetainNonConfigurationInstance()
+ * @see MessageList#getLastNonConfigurationInstance()
+ */
+ static class ActivityState {
+ public List messages;
+ public List activeMessages;
+ }
+
+ /* (non-Javadoc)
+ *
+ * Method overridden for proper typing within this class (the return type is
+ * more specific than the super implementation)
+ *
+ * @see android.app.Activity#onRetainNonConfigurationInstance()
+ */
@Override
- public Object onRetainNonConfigurationInstance() {
- return mAdapter.messages;
+ public ActivityState onRetainNonConfigurationInstance() {
+ final ActivityState state = new ActivityState();
+ state.messages = mAdapter.messages;
+ state.activeMessages = mActiveMessages;
+ return state;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * Method overridden for proper typing within this class (the return type is
+ * more specific than the super implementation)
+ *
+ * @see android.app.Activity#getLastNonConfigurationInstance()
+ */
+ @Override
+ public ActivityState getLastNonConfigurationInstance() {
+ return (ActivityState) super.getLastNonConfigurationInstance();
}
@Override
public void onBackPressed() {
- // This will be called either automatically for you on 2.0
- // or later, or by the code above on earlier versions of the
- // platform.
if (K9.manageBack()) {
if (mQueryString == null) {
onShowFolderList();
@@ -819,24 +961,12 @@ public class MessageList
onAccounts();
}
} else {
- finish();
+ super.onBackPressed();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (
- // XXX TODO - when we go to android 2.0, uncomment this
- // android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR &&
- keyCode == KeyEvent.KEYCODE_BACK
- && event.getRepeatCount() == 0
- ) {
- // Take care of calling this method on earlier versions of
- // the platform where it doesn't exist.
- onBackPressed();
- return true;
- }
-
// Shortcuts that work no matter what is selected
switch (keyCode) {
@@ -913,18 +1043,20 @@ public class MessageList
if (position >= 0) {
MessageInfoHolder message = (MessageInfoHolder) mAdapter.getItem(position);
+ final List selection = getSelectionFromMessage(message);
+
if (message != null) {
switch (keyCode) {
case KeyEvent.KEYCODE_DEL: {
- onDelete(message, position);
+ onDelete(selection);
return true;
}
case KeyEvent.KEYCODE_S: {
- setSelected(message, !message.selected);
+ setSelected(selection, !message.selected);
return true;
}
case KeyEvent.KEYCODE_D: {
- onDelete(message, position);
+ onDelete(selection);
return true;
}
case KeyEvent.KEYCODE_F: {
@@ -940,23 +1072,23 @@ public class MessageList
return true;
}
case KeyEvent.KEYCODE_G: {
- onToggleFlag(message);
+ setFlag(selection, Flag.FLAGGED, !message.flagged);
return true;
}
case KeyEvent.KEYCODE_M: {
- onMove(message);
+ onMove(selection);
return true;
}
case KeyEvent.KEYCODE_V: {
- onArchive(message);
+ onArchive(selection);
return true;
}
case KeyEvent.KEYCODE_Y: {
- onCopy(message);
+ onCopy(selection);
return true;
}
case KeyEvent.KEYCODE_Z: {
- onToggleRead(message);
+ setFlag(selection, Flag.SEEN, !message.read);
return true;
}
}
@@ -1002,7 +1134,7 @@ public class MessageList
MessageReference ref = message.message.makeMessageReference();
Log.i(K9.LOG_TAG, "MessageList sending message " + ref);
- MessageView.actionView(this, ref, messageRefs);
+ MessageView.actionView(this, ref, messageRefs, getIntent().getExtras());
}
/*
@@ -1097,150 +1229,54 @@ public class MessageList
reSort();
}
- private void onDelete(MessageInfoHolder holder, int position) {
- mAdapter.removeMessage(holder);
- mController.deleteMessages(new Message[] { holder.message }, null);
- }
-
- private void onMove(MessageInfoHolder holder) {
- if (!mController.isMoveCapable(holder.message.getFolder().getAccount())) {
- return;
+ /**
+ * @param holders
+ * Never {@code null}.
+ */
+ private void onDelete(final List holders) {
+ final List messagesToRemove = new ArrayList();
+ for (MessageInfoHolder holder : holders) {
+ messagesToRemove.add(holder.message);
}
-
- if (!mController.isMoveCapable(holder.message)) {
- Toast toast = Toast.makeText(this, R.string.move_copy_cannot_copy_unsynced_message, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
-
- final Account account = holder.message.getFolder().getAccount();
-
- Intent intent = new Intent(this, ChooseFolder.class);
- intent.putExtra(ChooseFolder.EXTRA_ACCOUNT, account.getUuid());
- intent.putExtra(ChooseFolder.EXTRA_CUR_FOLDER, holder.folder.name);
- intent.putExtra(ChooseFolder.EXTRA_SEL_FOLDER, account.getLastSelectedFolderName());
- intent.putExtra(ChooseFolder.EXTRA_MESSAGE, holder.message.makeMessageReference());
- startActivityForResult(intent, ACTIVITY_CHOOSE_FOLDER_MOVE);
- }
-
- private void onArchive(MessageInfoHolder holder) {
-
- if (!mController.isMoveCapable(holder.message)) {
- Toast toast = Toast.makeText(this, R.string.move_copy_cannot_copy_unsynced_message, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
-
- onMoveChosen(holder, holder.message.getFolder().getAccount().getArchiveFolderName());
- }
-
- private void onSpam(MessageInfoHolder holder) {
- if (K9.confirmSpam()) {
- // The action handler needs this to move the message later
- mSelectedMessage = holder;
- showDialog(R.id.dialog_confirm_spam);
- } else {
- moveToSpamFolder(holder);
- }
- }
-
- private void moveToSpamFolder(MessageInfoHolder holder) {
- if (!mController.isMoveCapable(holder.message)) {
- Toast toast = Toast.makeText(this, R.string.move_copy_cannot_copy_unsynced_message, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
- onMoveChosen(holder, holder.message.getFolder().getAccount().getSpamFolderName());
- }
-
- private void onCopy(MessageInfoHolder holder) {
- if (!mController.isCopyCapable(holder.message.getFolder().getAccount())) {
- return;
- }
-
- if (!mController.isCopyCapable(holder.message)) {
- Toast toast = Toast.makeText(this, R.string.move_copy_cannot_copy_unsynced_message, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
-
- final Account account = holder.message.getFolder().getAccount();
-
- Intent intent = new Intent(this, ChooseFolder.class);
- intent.putExtra(ChooseFolder.EXTRA_ACCOUNT, account.getUuid());
- intent.putExtra(ChooseFolder.EXTRA_CUR_FOLDER, holder.folder.name);
- intent.putExtra(ChooseFolder.EXTRA_SEL_FOLDER, account.getLastSelectedFolderName());
- intent.putExtra(ChooseFolder.EXTRA_MESSAGE, holder.message.makeMessageReference());
- startActivityForResult(intent, ACTIVITY_CHOOSE_FOLDER_COPY);
+ mHandler.removeMessages(holders);
+ mController.deleteMessages(messagesToRemove.toArray(EMPTY_MESSAGE_ARRAY), null);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (resultCode != RESULT_OK)
+ if (resultCode != RESULT_OK) {
return;
+ }
switch (requestCode) {
case ACTIVITY_CHOOSE_FOLDER_MOVE:
case ACTIVITY_CHOOSE_FOLDER_COPY: {
- if (data == null)
+ if (data == null) {
return;
+ }
final String destFolderName = data.getStringExtra(ChooseFolder.EXTRA_NEW_FOLDER);
- final MessageReference ref = data.getParcelableExtra(ChooseFolder.EXTRA_MESSAGE);
- final MessageInfoHolder m = mAdapter.getMessage(ref);
- if ((destFolderName != null) && (m != null)) {
- final Account account = m.message.getFolder().getAccount();
+ if (destFolderName != null) {
+ final List holders = mActiveMessages;
+ mActiveMessages = null; // don't need it any more
+
+ final Account account = holders.get(0).message.getFolder().getAccount();
account.setLastSelectedFolderName(destFolderName);
switch (requestCode) {
case ACTIVITY_CHOOSE_FOLDER_MOVE:
- onMoveChosen(m, destFolderName);
+ move(holders, destFolderName);
break;
case ACTIVITY_CHOOSE_FOLDER_COPY:
- onCopyChosen(m, destFolderName);
+ copy(holders, destFolderName);
break;
}
}
break;
}
- case ACTIVITY_CHOOSE_FOLDER_MOVE_BATCH:
- case ACTIVITY_CHOOSE_FOLDER_COPY_BATCH: {
- final String destFolderName = data.getStringExtra(ChooseFolder.EXTRA_NEW_FOLDER);
- final String accountUuid = data.getStringExtra(ChooseFolder.EXTRA_ACCOUNT);
- final Account account = Preferences.getPreferences(this).getAccount(accountUuid);
-
- account.setLastSelectedFolderName(destFolderName);
-
- switch (requestCode) {
- case ACTIVITY_CHOOSE_FOLDER_MOVE_BATCH:
- onMoveChosenBatch(destFolderName);
- break;
-
- case ACTIVITY_CHOOSE_FOLDER_COPY_BATCH:
- onCopyChosenBatch(destFolderName);
- break;
- }
- }
- }
- }
-
- private void onMoveChosen(MessageInfoHolder holder, String folderName) {
- if (mController.isMoveCapable(holder.message.getFolder().getAccount()) && folderName != null) {
- if (K9.FOLDER_NONE.equalsIgnoreCase(folderName)) {
- return;
- }
- mAdapter.removeMessage(holder);
- mController.moveMessage(holder.message.getFolder().getAccount(), holder.message.getFolder().getName(), holder.message, folderName, null);
- }
- }
-
- private void onCopyChosen(MessageInfoHolder holder, String folderName) {
- if (mController.isCopyCapable(holder.message.getFolder().getAccount()) && folderName != null) {
- mController.copyMessage(holder.message.getFolder().getAccount(),
- holder.message.getFolder().getName(), holder.message, folderName, null);
}
}
@@ -1302,15 +1338,21 @@ public class MessageList
case R.id.dialog_confirm_spam:
return ConfirmationDialog.create(this, id,
R.string.dialog_confirm_spam_title,
- R.string.dialog_confirm_spam_message,
+ "" /* text is refreshed by #onPrepareDialog(int, Dialog) below */,
R.string.dialog_confirm_spam_confirm_button,
R.string.dialog_confirm_spam_cancel_button,
new Runnable() {
@Override
public void run() {
- moveToSpamFolder(mSelectedMessage);
+ onSpamConfirmed(mActiveMessages);
// No further need for this reference
- mSelectedMessage = null;
+ mActiveMessages = null;
+ }
+ }, new Runnable() {
+ @Override
+ public void run() {
+ // event for cancel, we don't need this reference any more
+ mActiveMessages = null;
}
});
}
@@ -1318,8 +1360,16 @@ public class MessageList
return super.onCreateDialog(id);
}
+ /*
+ * (non-Javadoc)
+ *
+ * Android happens to invoke this method even if the given dialog is not
+ * shown (eg. a dismissed dialog) as part of the automatic activity
+ * reloading following a configuration change (orientation, keyboard,
+ * locale, etc.).
+ */
@Override
- public void onPrepareDialog(int id, Dialog dialog) {
+ public void onPrepareDialog(final int id, final Dialog dialog) {
switch (id) {
case DIALOG_MARK_ALL_AS_READ: {
if (mCurrentFolder != null) {
@@ -1328,6 +1378,19 @@ public class MessageList
}
break;
}
+ case R.id.dialog_confirm_spam: {
+ // mActiveMessages can be null if Android restarts the activity
+ // while this dialog is not actually shown (but was displayed at
+ // least once)
+ if (mActiveMessages != null) {
+ final int selectionSize = mActiveMessages.size();
+ final String message;
+ message = getResources().getQuantityString(R.plurals.dialog_confirm_spam_message, selectionSize,
+ Integer.valueOf(selectionSize));
+ ((AlertDialog) dialog).setMessage(message);
+ }
+ break;
+ }
default: {
super.onPrepareDialog(id, dialog);
}
@@ -1335,13 +1398,21 @@ public class MessageList
}
private void onToggleRead(MessageInfoHolder holder) {
- mController.setFlag(holder.message.getFolder().getAccount(), holder.message.getFolder().getName(), new String[] { holder.uid }, Flag.SEEN, !holder.read);
+ LocalMessage message = holder.message;
+ Folder folder = message.getFolder();
+ Account account = folder.getAccount();
+ String folderName = folder.getName();
+ mController.setFlag(account, folderName, new Message[] { message }, Flag.SEEN, !holder.read);
holder.read = !holder.read;
mHandler.sortMessages();
}
private void onToggleFlag(MessageInfoHolder holder) {
- mController.setFlag(holder.message.getFolder().getAccount(), holder.message.getFolder().getName(), new String[] { holder.uid }, Flag.FLAGGED, !holder.flagged);
+ LocalMessage message = holder.message;
+ Folder folder = message.getFolder();
+ Account account = folder.getAccount();
+ String folderName = folder.getName();
+ mController.setFlag(account, folderName, new Message[] { message }, Flag.FLAGGED, !holder.flagged);
holder.flagged = !holder.flagged;
mHandler.sortMessages();
}
@@ -1353,6 +1424,7 @@ public class MessageList
@Override
public boolean onOptionsItemSelected(MenuItem item) {
+ final List selection = getSelectionFromCheckboxes();
int itemId = item.getItemId();
switch (itemId) {
case R.id.compose: {
@@ -1399,23 +1471,23 @@ public class MessageList
return true;
}
case R.id.batch_delete_op: {
- deleteSelected();
+ onDelete(selection);
return true;
}
case R.id.batch_mark_read_op: {
- flagSelected(Flag.SEEN, true);
+ setFlag(selection, Flag.SEEN, true);
return true;
}
case R.id.batch_mark_unread_op: {
- flagSelected(Flag.SEEN, false);
+ setFlag(selection, Flag.SEEN, false);
return true;
}
case R.id.batch_flag_op: {
- flagSelected(Flag.FLAGGED, true);
+ setFlag(selection, Flag.FLAGGED, true);
return true;
}
case R.id.batch_unflag_op: {
- flagSelected(Flag.FLAGGED, false);
+ setFlag(selection, Flag.FLAGGED, false);
return true;
}
case R.id.app_settings: {
@@ -1462,19 +1534,19 @@ public class MessageList
return true;
}
case R.id.batch_copy_op: {
- onCopyBatch();
+ onCopy(selection);
return true;
}
case R.id.batch_archive_op: {
- onArchiveBatch();
+ onArchive(selection);
return true;
}
case R.id.batch_spam_op: {
- onSpamBatch();
+ onSpam(selection);
return true;
}
case R.id.batch_move_op: {
- onMoveBatch();
+ onMove(selection);
return true;
}
case R.id.expunge: {
@@ -1564,28 +1636,26 @@ public class MessageList
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
- MessageInfoHolder holder = mSelectedMessage;
+ final MessageInfoHolder holder = mSelectedMessage == null ? (MessageInfoHolder) mAdapter.getItem(info.position) : mSelectedMessage;
// don't need this anymore
mSelectedMessage = null;
- if (holder == null) {
- holder = (MessageInfoHolder) mAdapter.getItem(info.position);
- }
+ final List selection = getSelectionFromMessage(holder);
switch (item.getItemId()) {
case R.id.open: {
onOpenMessage(holder);
break;
}
case R.id.select: {
- setSelected(holder, true);
+ setSelected(selection, true);
break;
}
case R.id.deselect: {
- setSelected(holder, false);
+ setSelected(selection, false);
break;
}
case R.id.delete: {
- onDelete(holder, info.position);
+ onDelete(selection);
break;
}
case R.id.reply: {
@@ -1614,19 +1684,19 @@ public class MessageList
break;
}
case R.id.archive: {
- onArchive(holder);
+ onArchive(selection);
break;
}
case R.id.spam: {
- onSpam(holder);
+ onSpam(selection);
break;
}
case R.id.move: {
- onMove(holder);
+ onMove(selection);
break;
}
case R.id.copy: {
- onCopy(holder);
+ onCopy(selection);
break;
}
case R.id.send_alternate: {
@@ -1635,7 +1705,7 @@ public class MessageList
}
case R.id.same_sender: {
MessageList.actionHandle(MessageList.this,
- "From " + holder.sender, holder.senderAddress, true,
+ "From " + holder.sender, holder.senderAddress, false,
null, null);
break;
}
@@ -1662,35 +1732,34 @@ public class MessageList
}
}
- class MyGestureDetector extends SimpleOnGestureListener {
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
- if (e2 == null || e1 == null)
- return true;
+ @Override
+ protected void onSwipeRightToLeft(final MotionEvent e1, final MotionEvent e2) {
+ // Handle right-to-left as an un-select
+ handleSwipe(e1, false);
+ }
- float deltaX = e2.getX() - e1.getX(),
- deltaY = e2.getY() - e1.getY();
+ @Override
+ protected void onSwipeLeftToRight(final MotionEvent e1, final MotionEvent e2) {
+ // Handle left-to-right as a select.
+ handleSwipe(e1, true);
+ }
- boolean movedAcross = (Math.abs(deltaX) > Math.abs(deltaY * 4));
- boolean steadyHand = (Math.abs(deltaX / deltaY) > 2);
+ /**
+ * Handle a select or unselect swipe event
+ * @param downMotion Event that started the swipe
+ * @param selected true if this was an attempt to select (i.e. left to right).
+ */
+ private void handleSwipe(final MotionEvent downMotion, final boolean selected) {
+ int position = mListView.pointToPosition((int) downMotion.getX(), (int) downMotion.getY());
+ if (position != AdapterView.INVALID_POSITION) {
+ MessageInfoHolder msgInfoHolder = (MessageInfoHolder) mAdapter.getItem(position);
- if (movedAcross && steadyHand) {
- boolean selected = (deltaX > 0);
- int position = mListView.pointToPosition((int)e1.getX(), (int)e1.getY());
-
- if (position != AdapterView.INVALID_POSITION) {
- MessageInfoHolder msgInfoHolder = (MessageInfoHolder) mAdapter.getItem(position);
-
- if (msgInfoHolder != null && msgInfoHolder.selected != selected) {
- msgInfoHolder.selected = selected;
- mSelectedCount += (selected ? 1 : -1);
- mAdapter.notifyDataSetChanged();
- toggleBatchButtons();
- }
- }
+ if (msgInfoHolder != null && msgInfoHolder.selected != selected) {
+ msgInfoHolder.selected = selected;
+ mSelectedCount += (selected ? 1 : -1);
+ mAdapter.notifyDataSetChanged();
+ toggleBatchButtons();
}
-
- return false;
}
}
@@ -1800,7 +1869,7 @@ public class MessageList
if (holder == null) {
Log.w(K9.LOG_TAG, "Got callback to remove non-existent message with UID " + message.getUid());
} else {
- removeMessage(holder);
+ removeMessages(Collections.singletonList(holder));
}
}
@@ -1840,7 +1909,7 @@ public class MessageList
public void listLocalMessagesRemoveMessage(Account account, String folder, Message message) {
MessageInfoHolder holder = getMessage(message);
if (holder != null) {
- removeMessage(holder);
+ removeMessages(Collections.singletonList(holder));
}
}
@@ -1914,22 +1983,18 @@ public class MessageList
mSelectedCount--;
toggleBatchButtons();
}
- mAdapter.removeMessage(holder);
+ mAdapter.removeMessages(Collections.singletonList(holder));
}
}
}
}
+ /**
+ * @param holders
+ * Never {@code null}.
+ */
public void removeMessages(List holders) {
- if (holders != null) {
- mHandler.removeMessage(holders);
- }
- }
-
- public void removeMessage(MessageInfoHolder holder) {
- List messages = new ArrayList();
- messages.add(holder);
- removeMessages(messages);
+ mHandler.removeMessages(holders);
}
private void addOrUpdateMessage(Account account, String folderName, Message message, boolean verifyAgainstSearch) {
@@ -1984,7 +2049,7 @@ public class MessageList
}
}
- if (messagesToSearch.size() > 0) {
+ if (!messagesToSearch.isEmpty()) {
mController.searchLocalMessages(mAccountUuids, mFolderNames, messagesToSearch.toArray(EMPTY_MESSAGE_ARRAY), mQueryString, mIntegrate, mQueryFlags, mForbiddenFlags,
new MessagingListener() {
@Override
@@ -1994,11 +2059,11 @@ public class MessageList
});
}
- if (messagesToRemove.size() > 0) {
+ if (!messagesToRemove.isEmpty()) {
removeMessages(messagesToRemove);
}
- if (messagesToAdd.size() > 0) {
+ if (!messagesToAdd.isEmpty()) {
mHandler.addMessages(messagesToAdd);
}
@@ -2048,6 +2113,7 @@ public class MessageList
}
private final OnClickListener flagClickListener = new OnClickListener() {
+ @Override
public void onClick(View v) {
// Perform action on clicks
MessageInfoHolder message = (MessageInfoHolder) getItem((Integer)v.getTag());
@@ -2133,15 +2199,15 @@ public class MessageList
if (holder.selected != null) {
holder.selected.setOnCheckedChangeListener(holder);
}
- holder.subject.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getMessageListSubject());
- holder.date.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getMessageListDate());
+ holder.subject.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageListSubject());
+ holder.date.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageListDate());
if (mTouchView) {
holder.preview.setLines(mPreviewLines);
- holder.preview.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getMessageListPreview());
+ holder.preview.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageListPreview());
} else {
- holder.from.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mFontSizes.getMessageListSender());
+ holder.from.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageListSender());
}
view.setTag(holder);
@@ -2165,7 +2231,7 @@ public class MessageList
0,
noSender.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- str.setSpan(K9.createAbsoluteSizeSpan(mFontSizes.getMessageListSender()),
+ str.setSpan(new AbsoluteSizeSpan(mFontSizes.getMessageListSender(), true),
0,
noSender.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -2254,7 +2320,7 @@ public class MessageList
0,
message.sender.length() + 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- str.setSpan(K9.createAbsoluteSizeSpan(mFontSizes.getMessageListSender()),
+ str.setSpan(new AbsoluteSizeSpan(mFontSizes.getMessageListSender(), true),
0,
message.sender.length() + 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -2349,9 +2415,6 @@ public class MessageList
private View getFooterView(ViewGroup parent) {
if (mFooterView == null) {
mFooterView = mInflater.inflate(R.layout.message_list_item_footer, parent, false);
- if (mQueryString != null) {
- mFooterView.setVisibility(View.GONE);
- }
mFooterView.setId(R.layout.message_list_item_footer);
FooterViewHolder holder = new FooterViewHolder();
holder.progress = (ProgressBar) mFooterView.findViewById(R.id.message_list_progress);
@@ -2535,12 +2598,15 @@ public class MessageList
mHandler.sortMessages();
}
+ @Override
public void onAnimationEnd(Animation animation) {
}
+ @Override
public void onAnimationRepeat(Animation animation) {
}
+ @Override
public void onAnimationStart(Animation animation) {
}
@@ -2558,171 +2624,290 @@ public class MessageList
toggleBatchButtons();
}
- private void setSelected(MessageInfoHolder holder, boolean newState) {
- if (holder.selected != newState) {
- holder.selected = newState;
- mSelectedCount += (newState ? 1 : -1);
+ private void setSelected(final List holders, final boolean newState) {
+ for (final MessageInfoHolder holder : holders) {
+ if (holder.selected != newState) {
+ holder.selected = newState;
+ mSelectedCount += (newState ? 1 : -1);
+ }
}
mAdapter.notifyDataSetChanged();
toggleBatchButtons();
}
- private void flagSelected(Flag flag, boolean newState) {
- List messageList = new ArrayList();
- synchronized (mAdapter.messages) {
- for (MessageInfoHolder holder : mAdapter.messages) {
- if (holder.selected) {
- messageList.add(holder.message);
- if (flag == Flag.SEEN) {
- holder.read = newState;
- } else if (flag == Flag.FLAGGED) {
- holder.flagged = newState;
- }
- }
+ /**
+ * @param holders
+ * Messages to update. Never {@code null}.
+ * @param flag
+ * Flag to be updated on the specified messages. Never
+ * {@code null}.
+ * @param newState
+ * State to set for the given flag.
+ */
+ private void setFlag(final List holders, final Flag flag, final boolean newState) {
+ if (holders.isEmpty()) {
+ return;
+ }
+ final Message[] messageList = new Message[holders.size()];
+ int i = 0;
+ for (final Iterator iterator = holders.iterator(); iterator.hasNext(); i++) {
+ final MessageInfoHolder holder = iterator.next();
+ messageList[i] = holder.message;
+ if (flag == Flag.SEEN) {
+ holder.read = newState;
+ } else if (flag == Flag.FLAGGED) {
+ holder.flagged = newState;
}
}
- mController.setFlag(messageList.toArray(EMPTY_MESSAGE_ARRAY), flag, newState);
+ mController.setFlag(messageList, flag, newState);
mHandler.sortMessages();
}
- private void deleteSelected() {
- List messageList = new ArrayList();
- List removeHolderList = new ArrayList();
- synchronized (mAdapter.messages) {
- for (MessageInfoHolder holder : mAdapter.messages) {
- if (holder.selected) {
- removeHolderList.add(holder);
- messageList.add(holder.message);
- }
- }
- }
- mAdapter.removeMessages(removeHolderList);
-
- mController.deleteMessages(messageList.toArray(EMPTY_MESSAGE_ARRAY), null);
- mSelectedCount = 0;
- toggleBatchButtons();
- }
-
- private void onMoveBatch() {
- if (!mController.isMoveCapable(mAccount)) {
+ /**
+ * Display the message move activity.
+ *
+ * @param holders
+ * Never {@code null}.
+ */
+ private void onMove(final List holders) {
+ if (!checkCopyOrMovePossible(holders, FolderOperation.MOVE)) {
return;
}
- synchronized (mAdapter.messages) {
- for (MessageInfoHolder holder : mAdapter.messages) {
- if (holder.selected) {
- Message message = holder.message;
- if (!mController.isMoveCapable(message)) {
- Toast toast = Toast.makeText(this,
- R.string.move_copy_cannot_copy_unsynced_message, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
- }
- }
+ final Folder folder = holders.size() == 1 ? holders.get(0).message.getFolder() : mCurrentFolder.folder;
+ displayFolderChoice(ACTIVITY_CHOOSE_FOLDER_MOVE, folder, holders);
+ }
+
+ /**
+ * Display the message copy activity.
+ *
+ * @param holders
+ * Never {@code null}.
+ */
+ private void onCopy(final List holders) {
+ if (!checkCopyOrMovePossible(holders, FolderOperation.COPY)) {
+ return;
}
- final Folder folder = mCurrentFolder.folder;
+ final Folder folder = holders.size() == 1 ? holders.get(0).message.getFolder() : mCurrentFolder.folder;
+ displayFolderChoice(ACTIVITY_CHOOSE_FOLDER_COPY, folder, holders);
+ }
+
+ /**
+ * Helper method to manage the invocation of
+ * {@link #startActivityForResult(Intent, int)} for a folder operation
+ * ({@link ChooseFolder} activity), while saving a list of associated
+ * messages.
+ *
+ * @param requestCode
+ * If >= 0, this code will be returned in onActivityResult() when
+ * the activity exits.
+ * @param folder
+ * Never {@code null}.
+ * @param holders
+ * Messages to be affected by the folder operation. Never
+ * {@code null}.
+ * @see #startActivityForResult(Intent, int)
+ */
+ private void displayFolderChoice(final int requestCode, final Folder folder, final List holders) {
final Intent intent = new Intent(this, ChooseFolder.class);
- intent.putExtra(ChooseFolder.EXTRA_ACCOUNT, mAccount.getUuid());
+ intent.putExtra(ChooseFolder.EXTRA_ACCOUNT, folder.getAccount().getUuid());
intent.putExtra(ChooseFolder.EXTRA_CUR_FOLDER, folder.getName());
intent.putExtra(ChooseFolder.EXTRA_SEL_FOLDER, folder.getAccount().getLastSelectedFolderName());
- startActivityForResult(intent, ACTIVITY_CHOOSE_FOLDER_MOVE_BATCH);
+ // remember the selected messages for #onActivityResult
+ mActiveMessages = holders;
+ startActivityForResult(intent, requestCode);
}
- private void onMoveChosenBatch(String folderName) {
- if (!mController.isMoveCapable(mAccount)) {
- return;
- }
- List messageList = new ArrayList();
-
- List removeHolderList = new ArrayList();
- synchronized (mAdapter.messages) {
- for (MessageInfoHolder holder : mAdapter.messages) {
- if (holder.selected) {
- Message message = holder.message;
- if (!mController.isMoveCapable(message)) {
- Toast toast = Toast.makeText(this,
- R.string.move_copy_cannot_copy_unsynced_message, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
- messageList.add(holder.message);
- removeHolderList.add(holder);
- }
- }
- }
- mAdapter.removeMessages(removeHolderList);
-
- mController.moveMessages(mAccount, mCurrentFolder.name, messageList.toArray(EMPTY_MESSAGE_ARRAY), folderName, null);
- mSelectedCount = 0;
- toggleBatchButtons();
- }
-
- private void onArchiveBatch() {
- String folderName = mAccount.getArchiveFolderName();
+ /**
+ * @param holders
+ * Never {@code null}.
+ */
+ private void onArchive(final List holders) {
+ final String folderName = holders.get(0).message.getFolder().getAccount().getArchiveFolderName();
if (K9.FOLDER_NONE.equalsIgnoreCase(folderName)) {
return;
}
- onMoveChosenBatch(folderName);
+ // TODO one should separate messages by account and call move afterwards
+ // (because each account might have a specific Archive folder name)
+ move(holders, folderName);
}
- private void onSpamBatch() {
- String folderName = mAccount.getSpamFolderName();
+ /**
+ * @param holders
+ * Never {@code null}.
+ */
+ private void onSpam(final List holders) {
+ if (K9.confirmSpam()) {
+ // remember the message selection for #onCreateDialog(int)
+ mActiveMessages = holders;
+ showDialog(R.id.dialog_confirm_spam);
+ } else {
+ onSpamConfirmed(holders);
+ }
+ }
+
+ /**
+ * @param holders
+ * Never {@code null}.
+ */
+ private void onSpamConfirmed(final List holders) {
+ final String folderName = holders.get(0).message.getFolder().getAccount().getSpamFolderName();
if (K9.FOLDER_NONE.equalsIgnoreCase(folderName)) {
return;
}
- onMoveChosenBatch(folderName);
+ // TODO one should separate messages by account and call move afterwards
+ // (because each account might have a specific Spam folder name)
+ move(holders, folderName);
}
- private void onCopyBatch() {
- if (!mController.isCopyCapable(mAccount)) {
- return;
- }
+ private static enum FolderOperation {
+ COPY, MOVE
+ }
+ /**
+ * Display an Toast message if any message isn't synchronized
+ *
+ * @param holders
+ * Never null.
+ * @param operation
+ * Never {@code null}.
+ *
+ * @return true if operation is possible
+ */
+ private boolean checkCopyOrMovePossible(final List holders, final FolderOperation operation) {
+ if (holders.isEmpty()) {
+ return false;
+ }
+ boolean first = true;
+ for (final MessageInfoHolder holder : holders) {
+ final Message message = holder.message;
+ if (first) {
+ first = false;
+ // account check
+ final Account account = message.getFolder().getAccount();
+ if ((operation == FolderOperation.MOVE && !mController.isMoveCapable(account)) || (operation == FolderOperation.COPY && !mController.isCopyCapable(account))) {
+ return false;
+ }
+ }
+ // message check
+ if ((operation == FolderOperation.MOVE && !mController.isMoveCapable(message)) || (operation == FolderOperation.COPY && !mController.isCopyCapable(message))) {
+ final Toast toast = Toast.makeText(this, R.string.move_copy_cannot_copy_unsynced_message,
+ Toast.LENGTH_LONG);
+ toast.show();
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Helper method to get a List of message ready to be processed. This implementation will return a list containing the sole argument.
+ *
+ * @param holder Never {@code null}.
+ * @return Never {@code null}.
+ */
+ private List getSelectionFromMessage(final MessageInfoHolder holder) {
+ final List selection = Collections.singletonList(holder);
+ return selection;
+ }
+
+ /**
+ * Helper method to get a List of message ready to be processed. This implementation will iterate over messages and choose the checked ones.
+ *
+ * @return Never {@code null}.
+ */
+ private List getSelectionFromCheckboxes() {
+ final List selection = new ArrayList();
synchronized (mAdapter.messages) {
- for (MessageInfoHolder holder : mAdapter.messages) {
+ for (final MessageInfoHolder holder : mAdapter.messages) {
if (holder.selected) {
- Message message = holder.message;
- if (!mController.isCopyCapable(message)) {
- Toast toast = Toast.makeText(this,
- R.string.move_copy_cannot_copy_unsynced_message, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
+ selection.add(holder);
}
}
}
-
- final Folder folder = mCurrentFolder.folder;
- final Intent intent = new Intent(this, ChooseFolder.class);
- intent.putExtra(ChooseFolder.EXTRA_ACCOUNT, mAccount.getUuid());
- intent.putExtra(ChooseFolder.EXTRA_CUR_FOLDER, folder.getName());
- intent.putExtra(ChooseFolder.EXTRA_SEL_FOLDER, folder.getAccount().getLastSelectedFolderName());
- startActivityForResult(intent, ACTIVITY_CHOOSE_FOLDER_COPY_BATCH);
+ return selection;
}
- private void onCopyChosenBatch(String folderName) {
- if (!mController.isCopyCapable(mAccount)) {
+ /**
+ * Copy the specified messages to the specified folder.
+ *
+ * @param holders Never {@code null}.
+ * @param destination Never {@code null}.
+ */
+ private void copy(final List holders, final String destination) {
+ copyOrMove(holders, destination, FolderOperation.COPY);
+ }
+
+ /**
+ * Move the specified messages to the specified folder.
+ *
+ * @param holders Never {@code null}.
+ * @param destination Never {@code null}.
+ */
+ private void move(final List holders, final String destination) {
+ copyOrMove(holders, destination, FolderOperation.MOVE);
+ }
+
+ /**
+ * The underlying implementation for {@link #copy(List, String)} and
+ * {@link #move(List, String)}. This method was added mainly because those 2
+ * methods share common behavior.
+ *
+ * @param holders
+ * Never {@code null}.
+ * @param destination
+ * Never {@code null}.
+ * @param operation
+ * Never {@code null}.
+ */
+ private void copyOrMove(final List holders, final String destination, final FolderOperation operation) {
+ if (K9.FOLDER_NONE.equalsIgnoreCase(destination)) {
return;
}
- List messageList = new ArrayList();
- synchronized (mAdapter.messages) {
- for (MessageInfoHolder holder : mAdapter.messages) {
- if (holder.selected) {
- Message message = holder.message;
- if (!mController.isCopyCapable(message)) {
- Toast toast = Toast.makeText(this,
- R.string.move_copy_cannot_copy_unsynced_message, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
- messageList.add(holder.message);
+ boolean first = true;
+ Account account = null;
+ String folderName = null;
+
+ final List messages = new ArrayList(holders.size());
+
+ for (final MessageInfoHolder holder : holders) {
+ final Message message = holder.message;
+ if (first) {
+ first = false;
+ folderName = message.getFolder().getName();
+ account = message.getFolder().getAccount();
+ if ((operation == FolderOperation.MOVE && !mController.isMoveCapable(account)) || (operation == FolderOperation.COPY && !mController.isCopyCapable(account))) {
+ // account is not copy/move capable
+ return;
}
+ } else if (!account.equals(message.getFolder().getAccount())
+ || !folderName.equals(message.getFolder().getName())) {
+ // make sure all messages come from the same account/folder?
+ return;
}
+ if ((operation == FolderOperation.MOVE && !mController.isMoveCapable(message)) || (operation == FolderOperation.COPY && !mController.isCopyCapable(message))) {
+ final Toast toast = Toast.makeText(this, R.string.move_copy_cannot_copy_unsynced_message,
+ Toast.LENGTH_LONG);
+ toast.show();
+
+ // XXX return meaningful error value?
+
+ // message isn't synchronized
+ return;
+ }
+ messages.add(message);
+ }
+
+ if (operation == FolderOperation.MOVE) {
+ mController.moveMessages(account, folderName, messages.toArray(new Message[messages.size()]), destination,
+ null);
+ mHandler.removeMessages(holders);
+ } else {
+ mController.copyMessages(account, folderName, messages.toArray(new Message[messages.size()]), destination,
+ null);
}
- mController.copyMessages(mAccount, mCurrentFolder.name, messageList.toArray(EMPTY_MESSAGE_ARRAY), folderName, null);
}
protected void onAccountUnavailable() {
diff --git a/src/com/fsck/k9/activity/MessageView.java b/src/com/fsck/k9/activity/MessageView.java
index eee9a9485..221d195c9 100644
--- a/src/com/fsck/k9/activity/MessageView.java
+++ b/src/com/fsck/k9/activity/MessageView.java
@@ -33,6 +33,8 @@ public class MessageView extends K9Activity implements OnClickListener {
private static final String EXTRA_MESSAGE_REFERENCE = "com.fsck.k9.MessageView_messageReference";
private static final String EXTRA_MESSAGE_REFERENCES = "com.fsck.k9.MessageView_messageReferences";
private static final String EXTRA_NEXT = "com.fsck.k9.MessageView_next";
+ private static final String EXTRA_MESSAGE_LIST_EXTRAS = "com.fsck.k9.MessageView_messageListExtras";
+ private static final String EXTRA_SCROLL_PERCENTAGE = "com.fsck.k9.MessageView_scrollPercentage";
private static final String SHOW_PICTURES = "showPictures";
private static final String STATE_PGP_DATA = "pgpData";
private static final int ACTIVITY_CHOOSE_FOLDER_MOVE = 1;
@@ -50,14 +52,13 @@ public class MessageView extends K9Activity implements OnClickListener {
private View mArchive;
private View mMove;
private View mSpam;
- private ToggleScrollView mToggleScrollView;
private Account mAccount;
private MessageReference mMessageReference;
private ArrayList mMessageReferences;
private Message mMessage;
private static final int PREVIOUS = 1;
private static final int NEXT = 2;
- private int mLastDirection = PREVIOUS;
+ private int mLastDirection = (K9.messageViewShowNext()) ? NEXT : PREVIOUS;
private MessagingController mController = MessagingController.getInstance(getApplication());
private MessageReference mNextMessage = null;
private MessageReference mPreviousMessage = null;
@@ -77,6 +78,14 @@ public class MessageView extends K9Activity implements OnClickListener {
*/
private String mDstFolder;
+ /**
+ * The extras used to create the {@link MessageList} instance that created this activity. May
+ * be {@code null}.
+ *
+ * @see MessageList#actionHandleFolder(Context, Bundle)
+ */
+ private Bundle mMessageListExtras;
+
private final class StorageListenerImplementation implements StorageManager.StorageListener {
@Override
public void onUnmount(String providerId) {
@@ -92,7 +101,7 @@ public class MessageView extends K9Activity implements OnClickListener {
}
@Override
- public void onMount(String providerId) {} // no-op
+ public void onMount(String providerId) { /* no-op */ }
}
@@ -100,14 +109,14 @@ public class MessageView extends K9Activity implements OnClickListener {
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
// Text selection is finished. Allow scrolling again.
- mToggleScrollView.setScrolling(true);
+ mTopView.setScrolling(true);
} else if (K9.zoomControlsEnabled()) {
// If we have system zoom controls enabled, disable scrolling so the screen isn't wiggling around while
// trying to zoom.
if (ev.getAction() == MotionEvent.ACTION_POINTER_2_DOWN) {
- mToggleScrollView.setScrolling(false);
+ mTopView.setScrolling(false);
} else if (ev.getAction() == MotionEvent.ACTION_POINTER_2_UP) {
- mToggleScrollView.setScrolling(true);
+ mTopView.setScrolling(true);
}
}
return super.dispatchTouchEvent(ev);
@@ -117,7 +126,7 @@ public class MessageView extends K9Activity implements OnClickListener {
public boolean dispatchKeyEvent(KeyEvent event) {
boolean ret = false;
if (KeyEvent.ACTION_DOWN == event.getAction()) {
- ret = onKeyDown(event.getKeyCode(), event);
+ ret = onCustomKeyDown(event.getKeyCode(), event);
}
if (!ret) {
ret = super.dispatchKeyEvent(event);
@@ -125,20 +134,36 @@ public class MessageView extends K9Activity implements OnClickListener {
return ret;
}
- @Override
- public boolean onKeyDown(final int keyCode, final KeyEvent event) {
+ /**
+ * Handle hotkeys
+ *
+ *
+ * This method is called by {@link #dispatchKeyEvent(KeyEvent)} before any view had the chance
+ * to consume this key event.
+ *
+ *
+ * @param keyCode
+ * The value in {@code event.getKeyCode()}.
+ * @param event
+ * Description of the key event.
+ *
+ * @return {@code true} if this event was consumed.
+ */
+ public boolean onCustomKeyDown(final int keyCode, final KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP: {
if (K9.useVolumeKeysForNavigationEnabled()) {
onNext();
return true;
}
+ break;
}
case KeyEvent.KEYCODE_VOLUME_DOWN: {
if (K9.useVolumeKeysForNavigationEnabled()) {
onPrevious();
return true;
}
+ break;
}
case KeyEvent.KEYCODE_SHIFT_LEFT:
case KeyEvent.KEYCODE_SHIFT_RIGHT: {
@@ -146,7 +171,7 @@ public class MessageView extends K9Activity implements OnClickListener {
* Selecting text started via shift key. Disable scrolling as
* this causes problems when selecting text.
*/
- mToggleScrollView.setScrolling(false);
+ mTopView.setScrolling(false);
break;
}
case KeyEvent.KEYCODE_DEL: {
@@ -213,7 +238,7 @@ public class MessageView extends K9Activity implements OnClickListener {
return true;
}
}
- return super.onKeyDown(keyCode, event);
+ return false;
}
@Override
@@ -229,6 +254,18 @@ public class MessageView extends K9Activity implements OnClickListener {
return super.onKeyUp(keyCode, event);
}
+ @Override
+ public void onBackPressed() {
+ if (K9.manageBack()) {
+ if (mMessageListExtras != null) {
+ MessageList.actionHandleFolder(this, mMessageListExtras);
+ }
+ finish();
+ } else {
+ super.onBackPressed();
+ }
+ }
+
class MessageViewHandler extends Handler {
public void progress(final boolean progress) {
@@ -268,30 +305,15 @@ public class MessageView extends K9Activity implements OnClickListener {
public void fetchingAttachment() {
showToast(getString(R.string.message_view_fetching_attachment_toast), Toast.LENGTH_SHORT);
}
-
-
- public void setHeaders(final Message message, final Account account) {
- runOnUiThread(new Runnable() {
- public void run() {
- mMessageView.setHeaders(message, account);
- }
- });
- }
-
}
-
- public static void actionView(Context context, MessageReference messRef, ArrayList messReferences) {
- actionView(context, messRef, messReferences, null);
- }
-
- public static void actionView(Context context, MessageReference messRef, ArrayList messReferences, Bundle extras) {
+ public static void actionView(Context context, MessageReference messRef,
+ ArrayList messReferences, Bundle messageListExtras) {
Intent i = new Intent(context, MessageView.class);
+ i.putExtra(EXTRA_MESSAGE_LIST_EXTRAS, messageListExtras);
i.putExtra(EXTRA_MESSAGE_REFERENCE, messRef);
i.putParcelableArrayListExtra(EXTRA_MESSAGE_REFERENCES, messReferences);
- if (extras != null) {
- i.putExtras(extras);
- }
+ i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
@@ -302,7 +324,7 @@ public class MessageView extends K9Activity implements OnClickListener {
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.message_view);
- mTopView = mToggleScrollView = (ToggleScrollView) findViewById(R.id.top_view);
+ mTopView = (ToggleScrollView) findViewById(R.id.top_view);
mMessageView = (SingleMessageView) findViewById(R.id.message_view);
//set a callback for the attachment view. With this callback the attachmentview
@@ -331,12 +353,21 @@ public class MessageView extends K9Activity implements OnClickListener {
}
};
});
+
mMessageView.initialize(this);
+ // Register the ScrollView's listener to handle scrolling to last known location on resume.
+ mController.addListener(mTopView.getListener());
+ mMessageView.setListeners(mController.getListeners());
+
setTitle("");
- Intent intent = getIntent();
+ final Intent intent = getIntent();
+
+ mMessageListExtras = intent.getParcelableExtra(EXTRA_MESSAGE_LIST_EXTRAS);
+
Uri uri = intent.getData();
if (icicle != null) {
+ // TODO This code seems unnecessary since the icicle should already be thawed in onRestoreInstanceState().
mMessageReference = icicle.getParcelable(EXTRA_MESSAGE_REFERENCE);
mMessageReferences = icicle.getParcelableArrayList(EXTRA_MESSAGE_REFERENCES);
mPgpData = (PgpData) icicle.getSerializable(STATE_PGP_DATA);
@@ -347,7 +378,7 @@ public class MessageView extends K9Activity implements OnClickListener {
} else {
List segmentList = uri.getPathSegments();
if (segmentList.size() != 3) {
- //TODO: Use ressource to externalize message
+ //TODO: Use resource to externalize message
Toast.makeText(this, "Invalid intent uri: " + uri.toString(), Toast.LENGTH_LONG).show();
return;
}
@@ -363,7 +394,7 @@ public class MessageView extends K9Activity implements OnClickListener {
}
}
if (!found) {
- //TODO: Use ressource to externalize message
+ //TODO: Use resource to externalize message
Toast.makeText(this, "Invalid account id: " + accountId, Toast.LENGTH_LONG).show();
return;
}
@@ -450,6 +481,7 @@ public class MessageView extends K9Activity implements OnClickListener {
outState.putParcelableArrayList(EXTRA_MESSAGE_REFERENCES, mMessageReferences);
outState.putSerializable(STATE_PGP_DATA, mPgpData);
outState.putBoolean(SHOW_PICTURES, mMessageView.showPictures());
+ outState.putDouble(EXTRA_SCROLL_PERCENTAGE, mTopView.getScrollPercentage());
}
@Override
@@ -458,6 +490,7 @@ public class MessageView extends K9Activity implements OnClickListener {
mPgpData = (PgpData) savedInstanceState.getSerializable(STATE_PGP_DATA);
mMessageView.updateCryptoLayout(mAccount.getCryptoProvider(), mPgpData, mMessage);
mMessageView.setLoadPictures(savedInstanceState.getBoolean(SHOW_PICTURES));
+ mTopView.setScrollPercentage(savedInstanceState.getDouble(EXTRA_SCROLL_PERCENTAGE));
}
private void displayMessage(MessageReference ref) {
@@ -577,11 +610,13 @@ public class MessageView extends K9Activity implements OnClickListener {
onAccountUnavailable();
return;
}
+ mController.addListener(mTopView.getListener());
StorageManager.getInstance(getApplication()).addListener(mStorageListener);
}
@Override
protected void onPause() {
+ mController.removeListener(mTopView.getListener());
StorageManager.getInstance(getApplication()).removeListener(mStorageListener);
super.onPause();
}
@@ -596,7 +631,7 @@ public class MessageView extends K9Activity implements OnClickListener {
* Called from UI thread when user select Delete
*/
private void onDelete() {
- if (K9.confirmDelete()) {
+ if (K9.confirmDelete() || (K9.confirmDeleteStarred() && mMessage.isSet(Flag.FLAGGED))) {
showDialog(R.id.dialog_confirm_delete);
} else {
delete();
@@ -691,14 +726,10 @@ public class MessageView extends K9Activity implements OnClickListener {
private void onFlag() {
if (mMessage != null) {
- mController.setFlag(mAccount,
- mMessage.getFolder().getName(), new String[] {mMessage.getUid()}, Flag.FLAGGED, !mMessage.isSet(Flag.FLAGGED));
- try {
- mMessage.setFlag(Flag.FLAGGED, !mMessage.isSet(Flag.FLAGGED));
- mMessageView.setHeaders(mMessage, mAccount);
- } catch (MessagingException me) {
- Log.e(K9.LOG_TAG, "Could not set flag on local message", me);
- }
+ boolean newState = !mMessage.isSet(Flag.FLAGGED);
+ mController.setFlag(mAccount, mMessage.getFolder().getName(),
+ new Message[] { mMessage }, Flag.FLAGGED, newState);
+ mMessageView.setHeaders(mMessage, mAccount);
}
}
@@ -791,8 +822,25 @@ public class MessageView extends K9Activity implements OnClickListener {
}
}
+ /**
+ * Handle a right-to-left swipe as "move to next message."
+ */
@Override
+ protected void onSwipeRightToLeft(MotionEvent e1, MotionEvent e2) {
+ onNext();
+ }
+
+ /**
+ * Handle a left-to-right swipe as "move to previous message."
+ */
+ @Override
+ protected void onSwipeLeftToRight(MotionEvent e1, MotionEvent e2) {
+ onPrevious();
+ }
+
protected void onNext() {
+ // Reset scroll percentage when we change messages
+ mTopView.setScrollPercentage(0);
if (mNextMessage == null) {
Toast.makeText(this, getString(R.string.end_of_folder), Toast.LENGTH_SHORT).show();
return;
@@ -806,8 +854,9 @@ public class MessageView extends K9Activity implements OnClickListener {
mNext.requestFocus();
}
- @Override
protected void onPrevious() {
+ // Reset scroll percentage when we change messages
+ mTopView.setScrollPercentage(0);
if (mPreviousMessage == null) {
Toast.makeText(this, getString(R.string.end_of_folder), Toast.LENGTH_SHORT).show();
return;
@@ -823,15 +872,11 @@ public class MessageView extends K9Activity implements OnClickListener {
private void onMarkAsUnread() {
if (mMessage != null) {
-// (Issue 3319) mController.setFlag(mAccount, mMessageReference.folderName, new String[] { mMessage.getUid() }, Flag.SEEN, false);
- try {
- mMessage.setFlag(Flag.SEEN, false);
- mMessageView.setHeaders(mMessage, mAccount);
- String subject = mMessage.getSubject();
- setTitle(subject);
- } catch (Exception e) {
- Log.e(K9.LOG_TAG, "Unable to unset SEEN flag on message", e);
- }
+ mController.setFlag(mAccount, mMessage.getFolder().getName(),
+ new Message[] { mMessage }, Flag.SEEN, false);
+ mMessageView.setHeaders(mMessage, mAccount);
+ String subject = mMessage.getSubject();
+ setTitle(subject);
}
}
@@ -939,7 +984,7 @@ public class MessageView extends K9Activity implements OnClickListener {
});
break;
case R.id.select_text:
- mToggleScrollView.setScrolling(false);
+ mTopView.setScrolling(false);
mMessageView.beginSelectingText();
break;
default:
@@ -994,7 +1039,7 @@ public class MessageView extends K9Activity implements OnClickListener {
case R.id.dialog_confirm_spam:
return ConfirmationDialog.create(this, id,
R.string.dialog_confirm_spam_title,
- R.string.dialog_confirm_spam_message,
+ getResources().getQuantityString(R.plurals.dialog_confirm_spam_message, 1),
R.string.dialog_confirm_spam_confirm_button,
R.string.dialog_confirm_spam_cancel_button,
new Runnable() {
@@ -1035,8 +1080,8 @@ public class MessageView extends K9Activity implements OnClickListener {
mTopView.scrollTo(0, 0);
try {
if (MessageView.this.mMessage != null
- && MessageView.this.mMessage.isSet(Flag.X_DOWNLOADED_PARTIAL)
- && message.isSet(Flag.X_DOWNLOADED_FULL)) {
+ && MessageView.this.mMessage.isSet(Flag.X_DOWNLOADED_PARTIAL)
+ && message.isSet(Flag.X_DOWNLOADED_FULL)) {
mMessageView.setHeaders(message, account);
}
MessageView.this.mMessage = message;
@@ -1060,12 +1105,28 @@ public class MessageView extends K9Activity implements OnClickListener {
return;
}
MessageView.this.mMessage = message;
+
+ /*
+ * Clone the message object because the original could be modified by
+ * MessagingController later. This could lead to a ConcurrentModificationException
+ * when that same object is accessed by the UI thread (below).
+ *
+ * See issue 3953
+ *
+ * This is just an ugly hack to get rid of the most pressing problem. A proper way to
+ * fix this is to make Message thread-safe. Or, even better, rewriting the UI code to
+ * access messages via a ContentProvider.
+ *
+ */
+ final Message clonedMessage = message.clone();
+
runOnUiThread(new Runnable() {
public void run() {
- if (!message.isSet(Flag.X_DOWNLOADED_FULL) && !message.isSet(Flag.X_DOWNLOADED_PARTIAL)) {
+ if (!clonedMessage.isSet(Flag.X_DOWNLOADED_FULL) &&
+ !clonedMessage.isSet(Flag.X_DOWNLOADED_PARTIAL)) {
mMessageView.loadBodyFromUrl("file:///android_asset/downloading.html");
}
- mMessageView.setHeaders(message, account);
+ mMessageView.setHeaders(clonedMessage, account);
mMessageView.setOnFlagListener(new OnClickListener() {
@Override
public void onClick(View v) {
@@ -1196,5 +1257,4 @@ public class MessageView extends K9Activity implements OnClickListener {
// sometimes shows the original encrypted content
mMessageView.loadBodyFromText(mAccount.getCryptoProvider(), mPgpData, mMessage, mPgpData.getDecryptedData(), "text/plain");
}
-
}
diff --git a/src/com/fsck/k9/activity/SearchModifier.java b/src/com/fsck/k9/activity/SearchModifier.java
index b23330c80..8b610ff6e 100644
--- a/src/com/fsck/k9/activity/SearchModifier.java
+++ b/src/com/fsck/k9/activity/SearchModifier.java
@@ -1,13 +1,14 @@
-/**
- *
- */
package com.fsck.k9.activity;
import com.fsck.k9.R;
import com.fsck.k9.mail.Flag;
+/**
+ * This enum represents filtering parameters used by {@link com.fsck.k9.SearchAccount}.
+ */
enum SearchModifier {
- FLAGGED(R.string.flagged_modifier, new Flag[] { Flag.FLAGGED}, null), UNREAD(R.string.unread_modifier, null, new Flag[] { Flag.SEEN});
+ FLAGGED(R.string.flagged_modifier, new Flag[]{Flag.FLAGGED}, null),
+ UNREAD(R.string.unread_modifier, null, new Flag[]{Flag.SEEN});
final int resId;
final Flag[] requiredFlags;
diff --git a/src/com/fsck/k9/activity/UnreadWidgetConfiguration.java b/src/com/fsck/k9/activity/UnreadWidgetConfiguration.java
new file mode 100644
index 000000000..341f895ef
--- /dev/null
+++ b/src/com/fsck/k9/activity/UnreadWidgetConfiguration.java
@@ -0,0 +1,106 @@
+package com.fsck.k9.activity;
+
+import android.appwidget.AppWidgetManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.os.Bundle;
+
+import com.fsck.k9.Account;
+import com.fsck.k9.BaseAccount;
+import com.fsck.k9.R;
+import com.fsck.k9.provider.UnreadWidgetProvider;
+
+
+/**
+ * Activity to select an account for the unread widget.
+ */
+public class UnreadWidgetConfiguration extends AccountList {
+ /**
+ * Name of the preference file to store the widget configuration.
+ */
+ private static final String PREFS_NAME = "unread_widget_configuration.xml";
+
+ /**
+ * Prefix for the preference keys.
+ */
+ private static final String PREF_PREFIX_KEY = "unread_widget.";
+
+
+ /**
+ * The ID of the widget we are configuring.
+ */
+ private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
+
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ // Find the widget ID from the intent.
+ Intent intent = getIntent();
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
+ AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+
+ // If they gave us an intent without the widget ID, just bail.
+ if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
+ finish();
+ return;
+ }
+
+ setTitle(R.string.unread_widget_select_account);
+ }
+
+ @Override
+ protected boolean displaySpecialAccounts() {
+ return false;
+ }
+
+ @Override
+ protected void onAccountSelected(BaseAccount baseAccount) {
+ if (!(baseAccount instanceof Account)) {
+ finish();
+ return;
+ }
+
+ Account account = (Account) baseAccount;
+
+ // Save widget configuration
+ String accountUuid = account.getUuid();
+ saveAccountUuid(this, mAppWidgetId, accountUuid);
+
+ // Update widget
+ Context context = getApplicationContext();
+ AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
+ UnreadWidgetProvider.updateWidget(context, appWidgetManager, mAppWidgetId, accountUuid);
+
+ // Let the caller know that the configuration was successful
+ Intent resultValue = new Intent();
+ resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
+ setResult(RESULT_OK, resultValue);
+ finish();
+ }
+
+ private static void saveAccountUuid(Context context, int appWidgetId, String accountUuid) {
+ SharedPreferences.Editor editor =
+ context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit();
+ editor.putString(PREF_PREFIX_KEY + appWidgetId, accountUuid);
+ editor.commit();
+ }
+
+ public static String getAccountUuid(Context context, int appWidgetId) {
+ SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
+ String accountUuid = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);
+ return accountUuid;
+ }
+
+ public static void deleteWidgetConfiguration(Context context, int appWidgetId) {
+ Editor editor = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit();
+ editor.remove(PREF_PREFIX_KEY + appWidgetId);
+ editor.commit();
+ }
+}
diff --git a/src/com/fsck/k9/activity/misc/ExtendedAsyncTask.java b/src/com/fsck/k9/activity/misc/ExtendedAsyncTask.java
new file mode 100644
index 000000000..f8bef5741
--- /dev/null
+++ b/src/com/fsck/k9/activity/misc/ExtendedAsyncTask.java
@@ -0,0 +1,111 @@
+package com.fsck.k9.activity.misc;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.os.AsyncTask;
+
+/**
+ * Extends {@link AsyncTask} with methods to attach and detach an {@link Activity}.
+ *
+ *
+ * This is necessary to properly handle configuration changes that will restart an activity.
+ *
+ * Note:
+ * Implementing classes need to make sure they have no reference to the {@code Activity} instance
+ * that created the instance of that class. So if it's implemented as inner class, it needs to be
+ * {@code static}.
+ *