new icon, new about dialog, some refactorings

This commit is contained in:
Dominik 2012-03-09 18:43:10 +01:00
parent 8452fb62b7
commit 4a8d9694c4
86 changed files with 1044 additions and 132 deletions

View File

@ -8,7 +8,7 @@
android:versionName="1.1" > android:versionName="1.1" >
<uses-sdk <uses-sdk
android:minSdkVersion="3" android:minSdkVersion="4"
android:targetSdkVersion="14" /> android:targetSdkVersion="14" />
<permission <permission
@ -197,6 +197,11 @@
android:name=".ui.ImportFromQRCodeActivity" android:name=".ui.ImportFromQRCodeActivity"
android:configChanges="keyboardHidden|orientation|keyboard" android:configChanges="keyboardHidden|orientation|keyboard"
android:label="@string/title_importFromQRCode" /> android:label="@string/title_importFromQRCode" />
<activity
android:name=".ui.AboutActivity"
android:excludeFromRecents="true"
android:label="@string/title_about"
android:theme="@android:style/Theme.Dialog" />
<service android:name=".Service" /> <service android:name=".Service" />
<service <service

16
LICENSE Normal file
View File

@ -0,0 +1,16 @@
The following open source projects are used in APG:
* ZXing QRCode Integration
http://code.google.com/p/zxing/
Apache License v2
* SpongyCastle
https://github.com/rtyley/spongycastle
MIT X11 License
Images:
* icon.svg
modified version of GnuPG Logo (not)
http://openclipart.org/detail/15078/gnupg-logo-(not)-by-mrbordello
Public Domain

739
Resources/icon.svg Normal file
View File

@ -0,0 +1,739 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="16.879999"
inkscape:export-xdpi="16.879999"
inkscape:export-filename="/home/ds1/Projekte/APG Plus/res/drawable-xhdpi/icon.png"
version="1.0"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
sodipodi:docname="icon.svg"
inkscape:version="0.48.1 r9760"
sodipodi:version="0.32"
id="svg2"
height="512"
width="512">
<defs
id="defs4">
<linearGradient
id="linearGradient7008">
<stop
style="stop-color:#666666;stop-opacity:1;"
offset="0"
id="stop7010" />
<stop
style="stop-color:#d2d6d0;stop-opacity:1;"
offset="1"
id="stop7012" />
</linearGradient>
<linearGradient
id="linearGradient5479"
osb:paint="solid">
<stop
style="stop-color:#b3b3b3;stop-opacity:1;"
offset="0"
id="stop5481" />
</linearGradient>
<linearGradient
id="linearGradient4957">
<stop
id="stop4959"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop4961"
offset="1"
style="stop-color:#b6b3ac;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient4905">
<stop
style="stop-color:#00c2e6;stop-opacity:1;"
offset="0"
id="stop4907" />
<stop
style="stop-color:#007fa2;stop-opacity:1;"
offset="1"
id="stop4909" />
</linearGradient>
<linearGradient
id="linearGradient3861">
<stop
style="stop-color:#75a5ce;stop-opacity:1;"
offset="0"
id="stop3863" />
<stop
style="stop-color:#75a5ce;stop-opacity:1;"
offset="1"
id="stop3865" />
</linearGradient>
<linearGradient
id="linearGradient3849">
<stop
style="stop-color:#00789a;stop-opacity:1;"
offset="0"
id="stop3851" />
<stop
style="stop-color:#50789a;stop-opacity:1;"
offset="1"
id="stop3853" />
</linearGradient>
<linearGradient
id="linearGradient2201">
<stop
id="stop2203"
offset="0"
style="stop-color:#d5d5d5;stop-opacity:1;" />
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0.22727273"
id="stop2207" />
<stop
id="stop3082"
offset="0.87706614"
style="stop-color:#d1d1d1;stop-opacity:1;" />
<stop
id="stop2205"
offset="1"
style="stop-color:#afafaf;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient2191">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2193" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop2195" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2201"
id="linearGradient2199"
x1="320.69421"
y1="285.6604"
x2="253.32147"
y2="591.70483"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.93617,296.44,-189.045)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4905"
id="linearGradient4911"
x1="277.07236"
y1="211.8645"
x2="276.87354"
y2="552.9649"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.0112027,0,-2.3678154)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient4955"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5065"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5067"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5069"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5071"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5073"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5075"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5079"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5082"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5085"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5088"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5091"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298"
gradientTransform="translate(-8.0847263,-100.8597)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5137"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298"
gradientTransform="translate(-8.0847263,-100.8597)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5140"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-8.0847263,-100.8597)"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5148"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-8.0847263,-100.8597)"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5151"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-8.0847263,-100.8597)"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient5154"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-8.0847263,-100.8597)"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<filter
id="filter5214"
inkscape:label="Drop shadow"
width="1.5"
height="1.5"
x="-.25"
y="-.25">
<feGaussianBlur
id="feGaussianBlur5216"
in="SourceAlpha"
stdDeviation="2"
result="blur" />
<feColorMatrix
id="feColorMatrix5218"
result="bluralpha"
type="matrix"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.5 0 " />
<feOffset
id="feOffset5220"
in="bluralpha"
dx="0"
dy="6"
result="offsetBlur" />
<feMerge
id="feMerge5222">
<feMergeNode
id="feMergeNode5224"
in="offsetBlur" />
<feMergeNode
id="feMergeNode5226"
in="SourceGraphic" />
</feMerge>
</filter>
<filter
inkscape:collect="always"
id="filter5475">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="1.1836883"
id="feGaussianBlur5477" />
</filter>
<filter
inkscape:collect="always"
id="filter6936">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.72311148"
id="feGaussianBlur6938" />
</filter>
<filter
inkscape:collect="always"
id="filter6944">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.69609809"
id="feGaussianBlur6946" />
</filter>
<filter
inkscape:collect="always"
id="filter6952">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.68277711"
id="feGaussianBlur6954" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient6956"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient6978"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-8.0847263,-100.8597)"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient6980"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient6982"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-8.0847263,-100.8597)"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4957"
id="linearGradient6984"
gradientUnits="userSpaceOnUse"
x1="265.73489"
y1="232.44435"
x2="262.43457"
y2="535.43298" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7008"
id="linearGradient7014"
x1="215.32114"
y1="561.41132"
x2="215.79901"
y2="207.90399"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.37106997"
inkscape:cx="202.2058"
inkscape:cy="175.87027"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="1278"
inkscape:window-height="779"
inkscape:window-x="0"
inkscape:window-y="19"
showgrid="false"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-8.0847263,-100.8597)">
<image
y="-80.79155"
x="-799.50232"
id="image4902"
xlink:href="data:image/png;base64,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
"
height="697.32062"
width="697.32062" />
<rect
style="fill:#cab6b2;fill-opacity:1;stroke:#e6e6e6;stroke-width:7.59385872;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter6952)"
id="rect5269-9"
width="415.09143"
height="40.093307"
x="54.771664"
y="161.00397"
transform="matrix(1.0443987,0,0,1.0443987,-9.5360611,-20.336718)" />
<rect
style="fill:#00bee3;fill-rule:evenodd;stroke:#00e0f4;stroke-width:5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter6944)"
x="48.620232"
y="178.68233"
clip-rule="evenodd"
width="430.92899"
height="33.13641"
id="rect4077"
transform="matrix(1.0443987,0,0,1.0443987,-9.5360611,-20.336718)" />
<rect
style="fill:#cab6b2;fill-opacity:1;stroke:#ececec;stroke-width:6.39377022;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter6936)"
id="rect5269"
width="449.6232"
height="32.451118"
x="38.901093"
y="193.63016"
transform="matrix(1.0443987,0,0,1.0443987,-9.5360611,-20.336718)" />
<path
transform="matrix(1.0443987,0,0,1.0443987,-9.5360611,-20.336718)"
style="fill:url(#linearGradient4911);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7014);stroke-width:5;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter5475)"
d="m 38.873764,211.36108 451.425746,0 -6.45086,342.72265 -438.524022,1.29017 z"
id="rect4081"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<g
id="g6972"
transform="translate(0,30.267528)">
<path
id="path4097"
transform="matrix(1.0443987,0,0,1.0443987,-1.0923835,85.001022)"
d="m 162.03125,133.9375 c -49.54172,0 -89.6875,39.31605 -89.6875,87.875 0,48.52912 40.14578,87.90625 89.6875,87.90625 49.52683,0 89.65625,-39.36219 89.65625,-87.90625 0,-48.55895 -40.12942,-87.8898 -89.65625,-87.875 z M 127,179.5 c 15.431,-0.18063 30.22296,9.49659 36.53125,23.53125 1.1589,2.33661 2.03044,4.7691 2.625,7.25 l 67.84375,0 0,13.96875 0,6.96875 0,27.9375 -17.15625,0 0,-27.9375 -5.0625,0 0,22.4375 -16.28125,0 0,-22.4375 -30.28125,0 c -3.71161,11.68619 -12.49891,21.87072 -24.25,25.90625 -21.85981,8.94251 -48.933986,-6.26108 -53.15625,-29.3125 -5.704275,-23.08531 13.88377,-48.31905 37.71875,-48.28125 0.49884,-0.0265 0.97098,-0.0254 1.46875,-0.0312 z m 0.28125,15.25 c -4.75625,-0.039 -9.49795,1.29027 -13.53125,3.875 -13.9155,8.00528 -15.08095,29.07247 -3.3125,39.375 11.76556,11.32313 32.91529,6.54173 39.3125,-8.375 7.63441,-15.14179 -5.42735,-35.43389 -22.46875,-34.875 z"
style="fill:url(#linearGradient6978);fill-opacity:1;fill-rule:evenodd;filter:url(#filter5214)"
inkscape:connector-curvature="0" />
<path
transform="matrix(1.0443987,0,0,1.0443987,-9.5360611,-20.336718)"
id="path4099"
d="M 170.0922,462.95886 H 65.648064 c 0,-53.26442 61.677736,-48.23134 61.677736,-48.23134 12.71675,6.77529 27.27996,10.61716 42.7664,10.61716 15.47154,0 30.03476,-3.84187 42.73661,-10.61716 0,0 61.67774,-5.03308 61.67774,48.23134 H 170.0922 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:url(#linearGradient6980);fill-opacity:1;fill-rule:evenodd;filter:url(#filter5214)" />
<path
id="path4097-5"
transform="matrix(1.0443987,0,0,1.0443987,-1.0923835,85.001022)"
d="m 350.03125,133.8125 c -49.54172,0 -89.6875,39.31605 -89.6875,87.875 0,48.52912 40.14578,87.90625 89.6875,87.90625 49.52683,0 89.6875,-39.36219 89.6875,-87.90625 0,-48.55895 -40.16067,-87.8898 -89.6875,-87.875 z m -1.875,32 c 14.41604,-0.16876 28.26288,8.8572 34.15625,21.96875 2.40913,4.85738 3.44286,10.15179 3.34375,15.4375 l 3.8125,0 0,63.21875 -82.5625,0 0,-63.21875 3.71875,0 c 10e-4,-19.10536 16.53325,-37.40611 36.15625,-37.375 0.46603,-0.0248 0.90997,-0.0258 1.375,-0.0312 z m 0.25,14.25 c -4.4434,-0.0364 -8.85699,1.21027 -12.625,3.625 -7.09533,4.08178 -10.62297,11.79948 -10.59375,19.53125 l 46.28125,0 C 371.16721,191.329 360.94367,179.65133 348.40625,180.0625 z"
style="fill:url(#linearGradient6982);fill-opacity:1;fill-rule:evenodd;filter:url(#filter5214)"
inkscape:connector-curvature="0" />
<path
transform="matrix(1.0443987,0,0,1.0443987,-9.5360611,-20.336718)"
id="path4099-4"
d="M 358.10704,462.8403 H 253.66291 c 0,-53.26442 61.67773,-48.23134 61.67773,-48.23134 12.71675,6.77529 27.27995,10.61717 42.7664,10.61717 15.47154,0 30.03476,-3.84188 42.73661,-10.61717 0,0 61.67774,-5.03308 61.67774,48.23134 H 358.10704 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:url(#linearGradient6984);fill-opacity:1;fill-rule:evenodd;filter:url(#filter5214)" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

21
Resources/icon_sizes.txt Normal file
View File

@ -0,0 +1,21 @@
Launcher Icon:
-----------------------
ldpi: 36x36
mdpi: 48x48
hdpi: 72x72
xhdpi: 96x96
google code: 55x55
android market: 512x512
Status Bar Icon:
-----------------------
Android < 3.0
ldpi: 12x19
mdpi: 16x25
hdpi: 24x38
Android > 3.0
ldpi: 18x18
mdpi: 24x24
hdpi: 36x36
xhdpi: 48x48

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 536 B

After

Width:  |  Height:  |  Size: 536 B

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
res/drawable-hdpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 916 B

After

Width:  |  Height:  |  Size: 916 B

View File

Before

Width:  |  Height:  |  Size: 922 B

After

Width:  |  Height:  |  Size: 922 B

BIN
res/drawable-ldpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 938 B

After

Width:  |  Height:  |  Size: 938 B

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 288 B

After

Width:  |  Height:  |  Size: 288 B

View File

Before

Width:  |  Height:  |  Size: 526 B

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
res/drawable-mdpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
res/drawable-xhdpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:isScrollContainer="true"
android:orientation="vertical"
android:paddingBottom="15dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:scrollbars="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginRight="10dp"
android:src="@drawable/icon" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textStyle="bold" />
<TextView
android:id="@+id/about_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@android:style/TextAppearance.Small" />
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:autoLink="web"
android:text="@string/about_url"
android:textAppearance="@android:style/TextAppearance.Small" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/about_description"
android:textAppearance="@android:style/TextAppearance.Small" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/about_license"
android:textAppearance="@android:style/TextAppearance.Small" />
<!-- <TextView -->
<!-- android:layout_width="wrap_content" -->
<!-- android:layout_height="wrap_content" -->
<!-- android:layout_marginTop="8dp" -->
<!-- android:text="@string/about_developer" -->
<!-- android:textAppearance="@android:style/TextAppearance.Small" /> -->
<!-- <TextView -->
<!-- android:layout_width="wrap_content" -->
<!-- android:layout_height="wrap_content" -->
<!-- android:layout_marginTop="8dp" -->
<!-- android:text="@string/about_icons" -->
<!-- android:textAppearance="@android:style/TextAppearance.Small" /> -->
<!-- <TextView -->
<!-- android:layout_width="wrap_content" -->
<!-- android:layout_height="wrap_content" -->
<!-- android:layout_marginTop="8dp" -->
<!-- android:text="@string/about_libs" -->
<!-- android:textAppearance="@android:style/TextAppearance.Small" /> -->
</LinearLayout>
</ScrollView>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">APG Plus</string> <string name="app_name" translate="false">APG+</string>
<string name="about_url" translate="false">https://github.com/dschuermann/apg</string>
</resources> </resources>

View File

@ -46,7 +46,8 @@
<string name="title_unknownSignatureKey">Unknown Signature Key</string> <string name="title_unknownSignatureKey">Unknown Signature Key</string>
<string name="title_importFromQRCode">Import from QR Code</string> <string name="title_importFromQRCode">Import from QR Code</string>
<string name="title_signKey">Sign Key</string> <string name="title_signKey">Sign Key</string>
<string name="title_about">About</string>
<!-- section_lowerCase: capitalized words, no punctuation --> <!-- section_lowerCase: capitalized words, no punctuation -->
<string name="section_userIds">User IDs</string> <string name="section_userIds">User IDs</string>
<string name="section_keys">Keys</string> <string name="section_keys">Keys</string>
@ -314,7 +315,13 @@
<string name="fast">fast</string> <string name="fast">fast</string>
<string name="slow">slow</string> <string name="slow">slow</string>
<string name="very_slow">very slow</string> <string name="very_slow">very slow</string>
<!-- about -->
<string name="about_description">Android Privacy Guard (APG) is a OpenPGP implementation for Android.</string>
<string name="about_license">License: Apache License 2.0</string>
<string name="about_version">Version:</string>
<string name="about_developer">Developer: ...</string>
<!-- texts --> <!-- texts -->
<!-- "OI File Manager", "ASTRO", and "K-9 Mail" must not be translated in order for the links to the market to work. --> <!-- "OI File Manager", "ASTRO", and "K-9 Mail" must not be translated in order for the links to the market to work. -->
<string name="text_help">Install K-9 Mail for the best integration, it supports APG for PGP/INLINE and lets you directly encrypt/decrypt emails. <string name="text_help">Install K-9 Mail for the best integration, it supports APG for PGP/INLINE and lets you directly encrypt/decrypt emails.

View File

@ -1966,8 +1966,8 @@ public class Apg {
} }
if (signatureKey == null) { if (signatureKey == null) {
Bundle pauseData = new Bundle(); Bundle pauseData = new Bundle();
pauseData.putInt(Constants.extras.status, Id.message.unknown_signature_key); pauseData.putInt(Constants.extras.STATUS, Id.message.unknown_signature_key);
pauseData.putLong(Constants.extras.key_id, signatureKeyId); pauseData.putLong(Constants.extras.KEY_ID, signatureKeyId);
Message msg = new Message(); Message msg = new Message();
msg.setData(pauseData); msg.setData(pauseData);
context.sendMessage(msg); context.sendMessage(msg);

View File

@ -20,35 +20,35 @@ import android.os.Environment;
public final class Constants { public final class Constants {
public static final String tag = "APG"; public static final String TAG = "APG";
public static final class path { public static final class path {
public static final String app_dir = Environment.getExternalStorageDirectory() + "/APG"; public static final String APP_DIR = Environment.getExternalStorageDirectory() + "/APG";
} }
public static final class pref { public static final class pref {
public static final String has_seen_help = "seenHelp"; public static final String HAS_SEEN_HELP = "seenHelp";
public static final String has_seen_change_log = "seenChangeLogDialog"; public static final String HAS_SEEN_CHANGE_LOG = "seenChangeLogDialog";
public static final String default_encryption_algorithm = "defaultEncryptionAlgorithm"; public static final String DEFAULT_ENCRYPTION_ALGORITHM = "defaultEncryptionAlgorithm";
public static final String default_hash_algorithm = "defaultHashAlgorithm"; public static final String DEFAULT_HASH_ALGORITHM = "defaultHashAlgorithm";
public static final String default_ascii_armour = "defaultAsciiArmour"; public static final String DEFAULT_ASCII_ARMOUR = "defaultAsciiArmour";
public static final String default_message_compression = "defaultMessageCompression"; public static final String DEFAULT_MESSAGE_COMPRESSION = "defaultMessageCompression";
public static final String default_file_compression = "defaultFileCompression"; public static final String DEFAULT_FILE_COMPRESSION = "defaultFileCompression";
public static final String pass_phrase_cache_ttl = "passPhraseCacheTtl"; public static final String PASS_PHRASE_CACHE_TTL = "passPhraseCacheTtl";
public static final String language = "language"; public static final String LANGUAGE = "language";
public static final String force_v3_signatures = "forceV3Signatures"; public static final String FORCE_V3_SIGNATURES = "forceV3Signatures";
public static final String key_servers = "keyServers"; public static final String KEY_SERVERS = "keyServers";
} }
public static final class defaults { public static final class defaults {
public static final String key_servers = "pool.sks-keyservers.net, subkeys.pgp.net, pgp.mit.edu"; public static final String KEY_SERVERS = "pool.sks-keyservers.net, subkeys.pgp.net, pgp.mit.edu";
} }
public static final class extras { public static final class extras {
public static final String progress = "progress"; public static final String PROGRESS = "progress";
public static final String progress_max = "max"; public static final String PROGRESS_MAX = "max";
public static final String status = "status"; public static final String STATUS = "status";
public static final String message = "message"; public static final String MESSAGE = "message";
public static final String key_id = "keyId"; public static final String KEY_ID = "keyId";
} }
} }

View File

@ -88,7 +88,7 @@ public final class Id {
public static final int export_keys = 0x2107000c; public static final int export_keys = 0x2107000c;
public static final int exporting = 0x2107000d; public static final int exporting = 0x2107000d;
public static final int new_account = 0x2107000e; public static final int new_account = 0x2107000e;
public static final int about = 0x2107000f; // public static final int about = 0x2107000f;
public static final int change_log = 0x21070010; public static final int change_log = 0x21070010;
public static final int output_filename = 0x21070011; public static final int output_filename = 0x21070011;
public static final int delete_file = 0x21070012; public static final int delete_file = 0x21070012;

View File

@ -28,17 +28,17 @@ public class Preferences {
} }
public String getLanguage() { public String getLanguage() {
return mSharedPreferences.getString(Constants.pref.language, ""); return mSharedPreferences.getString(Constants.pref.LANGUAGE, "");
} }
public void setLanguage(String value) { public void setLanguage(String value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString(Constants.pref.language, value); editor.putString(Constants.pref.LANGUAGE, value);
editor.commit(); editor.commit();
} }
public int getPassPhraseCacheTtl() { public int getPassPhraseCacheTtl() {
int ttl = mSharedPreferences.getInt(Constants.pref.pass_phrase_cache_ttl, 180); int ttl = mSharedPreferences.getInt(Constants.pref.PASS_PHRASE_CACHE_TTL, 180);
// fix the value if it was set to "never" in previous versions, which currently is not // fix the value if it was set to "never" in previous versions, which currently is not
// supported // supported
if (ttl == 0) { if (ttl == 0) {
@ -49,97 +49,97 @@ public class Preferences {
public void setPassPhraseCacheTtl(int value) { public void setPassPhraseCacheTtl(int value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putInt(Constants.pref.pass_phrase_cache_ttl, value); editor.putInt(Constants.pref.PASS_PHRASE_CACHE_TTL, value);
editor.commit(); editor.commit();
} }
public int getDefaultEncryptionAlgorithm() { public int getDefaultEncryptionAlgorithm() {
return mSharedPreferences.getInt(Constants.pref.default_encryption_algorithm, return mSharedPreferences.getInt(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM,
PGPEncryptedData.AES_256); PGPEncryptedData.AES_256);
} }
public void setDefaultEncryptionAlgorithm(int value) { public void setDefaultEncryptionAlgorithm(int value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putInt(Constants.pref.default_encryption_algorithm, value); editor.putInt(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM, value);
editor.commit(); editor.commit();
} }
public int getDefaultHashAlgorithm() { public int getDefaultHashAlgorithm() {
return mSharedPreferences.getInt(Constants.pref.default_hash_algorithm, return mSharedPreferences.getInt(Constants.pref.DEFAULT_HASH_ALGORITHM,
HashAlgorithmTags.SHA256); HashAlgorithmTags.SHA256);
} }
public void setDefaultHashAlgorithm(int value) { public void setDefaultHashAlgorithm(int value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putInt(Constants.pref.default_hash_algorithm, value); editor.putInt(Constants.pref.DEFAULT_HASH_ALGORITHM, value);
editor.commit(); editor.commit();
} }
public int getDefaultMessageCompression() { public int getDefaultMessageCompression() {
return mSharedPreferences.getInt(Constants.pref.default_message_compression, return mSharedPreferences.getInt(Constants.pref.DEFAULT_MESSAGE_COMPRESSION,
Id.choice.compression.zlib); Id.choice.compression.zlib);
} }
public void setDefaultMessageCompression(int value) { public void setDefaultMessageCompression(int value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putInt(Constants.pref.default_message_compression, value); editor.putInt(Constants.pref.DEFAULT_MESSAGE_COMPRESSION, value);
editor.commit(); editor.commit();
} }
public int getDefaultFileCompression() { public int getDefaultFileCompression() {
return mSharedPreferences.getInt(Constants.pref.default_file_compression, return mSharedPreferences.getInt(Constants.pref.DEFAULT_FILE_COMPRESSION,
Id.choice.compression.none); Id.choice.compression.none);
} }
public void setDefaultFileCompression(int value) { public void setDefaultFileCompression(int value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putInt(Constants.pref.default_file_compression, value); editor.putInt(Constants.pref.DEFAULT_FILE_COMPRESSION, value);
editor.commit(); editor.commit();
} }
public boolean getDefaultAsciiArmour() { public boolean getDefaultAsciiArmour() {
return mSharedPreferences.getBoolean(Constants.pref.default_ascii_armour, false); return mSharedPreferences.getBoolean(Constants.pref.DEFAULT_ASCII_ARMOUR, false);
} }
public void setDefaultAsciiArmour(boolean value) { public void setDefaultAsciiArmour(boolean value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putBoolean(Constants.pref.default_ascii_armour, value); editor.putBoolean(Constants.pref.DEFAULT_ASCII_ARMOUR, value);
editor.commit(); editor.commit();
} }
public boolean getForceV3Signatures() { public boolean getForceV3Signatures() {
return mSharedPreferences.getBoolean(Constants.pref.force_v3_signatures, false); return mSharedPreferences.getBoolean(Constants.pref.FORCE_V3_SIGNATURES, false);
} }
public void setForceV3Signatures(boolean value) { public void setForceV3Signatures(boolean value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putBoolean(Constants.pref.force_v3_signatures, value); editor.putBoolean(Constants.pref.FORCE_V3_SIGNATURES, value);
editor.commit(); editor.commit();
} }
public boolean hasSeenChangeLog(String version) { public boolean hasSeenChangeLog(String version) {
return mSharedPreferences.getBoolean(Constants.pref.has_seen_change_log + version, false); return mSharedPreferences.getBoolean(Constants.pref.HAS_SEEN_CHANGE_LOG + version, false);
} }
public void setHasSeenChangeLog(String version, boolean value) { public void setHasSeenChangeLog(String version, boolean value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putBoolean(Constants.pref.has_seen_change_log + version, value); editor.putBoolean(Constants.pref.HAS_SEEN_CHANGE_LOG + version, value);
editor.commit(); editor.commit();
} }
public boolean hasSeenHelp() { public boolean hasSeenHelp() {
return mSharedPreferences.getBoolean(Constants.pref.has_seen_help, false); return mSharedPreferences.getBoolean(Constants.pref.HAS_SEEN_HELP, false);
} }
public void setHasSeenHelp(boolean value) { public void setHasSeenHelp(boolean value) {
SharedPreferences.Editor editor = mSharedPreferences.edit(); SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putBoolean(Constants.pref.has_seen_help, value); editor.putBoolean(Constants.pref.HAS_SEEN_HELP, value);
editor.commit(); editor.commit();
} }
public String[] getKeyServers() { public String[] getKeyServers() {
String rawData = mSharedPreferences.getString(Constants.pref.key_servers, String rawData = mSharedPreferences.getString(Constants.pref.KEY_SERVERS,
Constants.defaults.key_servers); Constants.defaults.KEY_SERVERS);
Vector<String> servers = new Vector<String>(); Vector<String> servers = new Vector<String>();
String chunks[] = rawData.split(","); String chunks[] = rawData.split(",");
for (int i = 0; i < chunks.length; ++i) { for (int i = 0; i < chunks.length; ++i) {
@ -164,7 +164,7 @@ public class Preferences {
} }
rawData += tmp; rawData += tmp;
} }
editor.putString(Constants.pref.key_servers, rawData); editor.putString(Constants.pref.KEY_SERVERS, rawData);
editor.commit(); editor.commit();
} }
} }

View File

@ -24,7 +24,7 @@ public class ApgServiceBlobProvider extends ContentProvider {
private static final String COLUMN_KEY = "key"; private static final String COLUMN_KEY = "key";
private static final String STORE_PATH = Constants.path.app_dir+"/ApgServiceBlobs"; private static final String STORE_PATH = Constants.path.APP_DIR+"/ApgServiceBlobs";
private ApgServiceBlobDatabase mDb = null; private ApgServiceBlobDatabase mDb = null;

View File

@ -0,0 +1,51 @@
package org.apg.ui;
import org.apg.Constants;
import org.apg.R;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class AboutActivity extends Activity {
Activity mActivity;
/**
* Instantiate View for this Activity
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about_activity);
mActivity = this;
TextView versionText = (TextView) findViewById(R.id.about_version);
versionText.setText(getString(R.string.about_version) + " " + getVersion());
}
/**
* Get the current package version.
*
* @return The current version.
*/
private String getVersion() {
String result = "";
try {
PackageManager manager = mActivity.getPackageManager();
PackageInfo info = manager.getPackageInfo(mActivity.getPackageName(), 0);
result = String.format("%s (%s)", info.versionName, info.versionCode);
} catch (NameNotFoundException e) {
Log.w(Constants.TAG, "Unable to get application version: " + e.getMessage());
result = "Unable to get application version.";
}
return result;
}
}

View File

@ -79,7 +79,7 @@ public class BaseActivity extends Activity implements Runnable, ProgressDialogUp
Apg.initialize(this); Apg.initialize(this);
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File dir = new File(Constants.path.app_dir); File dir = new File(Constants.path.APP_DIR);
if (!dir.exists() && !dir.mkdirs()) { if (!dir.exists() && !dir.mkdirs()) {
// ignore this for now, it's not crucial // ignore this for now, it's not crucial
// that the directory doesn't exist at this point // that the directory doesn't exist at this point
@ -108,7 +108,7 @@ public class BaseActivity extends Activity implements Runnable, ProgressDialogUp
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case Id.menu.option.about: { case Id.menu.option.about: {
showDialog(Id.dialog.about); startActivity(new Intent(this, AboutActivity.class));
return true; return true;
} }
@ -187,31 +187,6 @@ public class BaseActivity extends Activity implements Runnable, ProgressDialogUp
mProgressDialog = null; mProgressDialog = null;
switch (id) { switch (id) {
case Id.dialog.about: {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("About " + Apg.getFullVersion(this));
LayoutInflater inflater = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.info, null);
TextView message = (TextView) layout.findViewById(R.id.message);
message.setText("This is an attempt to bring OpenPGP to Android. "
+ "It is far from complete, but more features are planned (see website).\n\n"
+ "Feel free to send bug reports, suggestions, feature requests, feedback, "
+ "photographs.\n\n" + "mail: thi@thialfihar.org\n"
+ "site: http://apg.thialfihar.org\n\n"
+ "This software is provided \"as is\", without warranty of any kind.");
alert.setView(layout);
alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
BaseActivity.this.removeDialog(Id.dialog.about);
}
});
return alert.create();
}
case Id.dialog.pass_phrase: { case Id.dialog.pass_phrase: {
return AskForSecretKeyPassPhrase.createDialog(this, getSecretKeyId(), this); return AskForSecretKeyPassPhrase.createDialog(this, getSecretKeyId(), this);
@ -266,7 +241,7 @@ public class BaseActivity extends Activity implements Runnable, ProgressDialogUp
mDeletingThread = new Thread(new Runnable() { mDeletingThread = new Thread(new Runnable() {
public void run() { public void run() {
Bundle data = new Bundle(); Bundle data = new Bundle();
data.putInt(Constants.extras.status, Id.message.delete_done); data.putInt(Constants.extras.STATUS, Id.message.delete_done);
try { try {
Apg.deleteFileSecurely(BaseActivity.this, file, BaseActivity.this); Apg.deleteFileSecurely(BaseActivity.this, file, BaseActivity.this);
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
@ -330,9 +305,9 @@ public class BaseActivity extends Activity implements Runnable, ProgressDialogUp
public void setProgress(int progress, int max) { public void setProgress(int progress, int max) {
Message msg = new Message(); Message msg = new Message();
Bundle data = new Bundle(); Bundle data = new Bundle();
data.putInt(Constants.extras.status, Id.message.progress_update); data.putInt(Constants.extras.STATUS, Id.message.progress_update);
data.putInt(Constants.extras.progress, progress); data.putInt(Constants.extras.PROGRESS, progress);
data.putInt(Constants.extras.progress_max, max); data.putInt(Constants.extras.PROGRESS_MAX, max);
msg.setData(data); msg.setData(data);
mHandler.sendMessage(msg); mHandler.sendMessage(msg);
} }
@ -340,10 +315,10 @@ public class BaseActivity extends Activity implements Runnable, ProgressDialogUp
public void setProgress(String message, int progress, int max) { public void setProgress(String message, int progress, int max) {
Message msg = new Message(); Message msg = new Message();
Bundle data = new Bundle(); Bundle data = new Bundle();
data.putInt(Constants.extras.status, Id.message.progress_update); data.putInt(Constants.extras.STATUS, Id.message.progress_update);
data.putString(Constants.extras.message, message); data.putString(Constants.extras.MESSAGE, message);
data.putInt(Constants.extras.progress, progress); data.putInt(Constants.extras.PROGRESS, progress);
data.putInt(Constants.extras.progress_max, max); data.putInt(Constants.extras.PROGRESS_MAX, max);
msg.setData(data); msg.setData(data);
mHandler.sendMessage(msg); mHandler.sendMessage(msg);
} }
@ -354,16 +329,16 @@ public class BaseActivity extends Activity implements Runnable, ProgressDialogUp
return; return;
} }
int type = data.getInt(Constants.extras.status); int type = data.getInt(Constants.extras.STATUS);
switch (type) { switch (type) {
case Id.message.progress_update: { case Id.message.progress_update: {
String message = data.getString(Constants.extras.message); String message = data.getString(Constants.extras.MESSAGE);
if (mProgressDialog != null) { if (mProgressDialog != null) {
if (message != null) { if (message != null) {
mProgressDialog.setMessage(message); mProgressDialog.setMessage(message);
} }
mProgressDialog.setMax(data.getInt(Constants.extras.progress_max)); mProgressDialog.setMax(data.getInt(Constants.extras.PROGRESS_MAX));
mProgressDialog.setProgress(data.getInt(Constants.extras.progress)); mProgressDialog.setProgress(data.getInt(Constants.extras.PROGRESS));
} }
break; break;
} }

View File

@ -196,28 +196,28 @@ public class DecryptActivity extends BaseActivity {
// ignore, then // ignore, then
} }
} else if (Apg.Intent.DECRYPT.equals(mIntent.getAction())) { } else if (Apg.Intent.DECRYPT.equals(mIntent.getAction())) {
Log.d(Constants.tag, "Apg Intent DECRYPT startet"); Log.d(Constants.TAG, "Apg Intent DECRYPT startet");
Bundle extras = mIntent.getExtras(); Bundle extras = mIntent.getExtras();
if (extras == null) { if (extras == null) {
Log.d(Constants.tag, "extra bundle was null"); Log.d(Constants.TAG, "extra bundle was null");
extras = new Bundle(); extras = new Bundle();
} else { } else {
Log.d(Constants.tag, "got extras"); Log.d(Constants.TAG, "got extras");
} }
mData = extras.getByteArray(Apg.EXTRA_DATA); mData = extras.getByteArray(Apg.EXTRA_DATA);
String textData = null; String textData = null;
if (mData == null) { if (mData == null) {
Log.d(Constants.tag, "EXTRA_DATA was null"); Log.d(Constants.TAG, "EXTRA_DATA was null");
textData = extras.getString(Apg.EXTRA_TEXT); textData = extras.getString(Apg.EXTRA_TEXT);
} else { } else {
Log.d(Constants.tag, "Got data from EXTRA_DATA"); Log.d(Constants.TAG, "Got data from EXTRA_DATA");
} }
if (textData != null) { if (textData != null) {
Log.d(Constants.tag, "textData null, matching text ..."); Log.d(Constants.TAG, "textData null, matching text ...");
Matcher matcher = Apg.PGP_MESSAGE.matcher(textData); Matcher matcher = Apg.PGP_MESSAGE.matcher(textData);
if (matcher.matches()) { if (matcher.matches()) {
Log.d(Constants.tag, "PGP_MESSAGE matched"); Log.d(Constants.TAG, "PGP_MESSAGE matched");
textData = matcher.group(1); textData = matcher.group(1);
// replace non breakable spaces // replace non breakable spaces
textData = textData.replaceAll("\\xa0", " "); textData = textData.replaceAll("\\xa0", " ");
@ -225,14 +225,14 @@ public class DecryptActivity extends BaseActivity {
} else { } else {
matcher = Apg.PGP_SIGNED_MESSAGE.matcher(textData); matcher = Apg.PGP_SIGNED_MESSAGE.matcher(textData);
if (matcher.matches()) { if (matcher.matches()) {
Log.d(Constants.tag, "PGP_SIGNED_MESSAGE matched"); Log.d(Constants.TAG, "PGP_SIGNED_MESSAGE matched");
textData = matcher.group(1); textData = matcher.group(1);
// replace non breakable spaces // replace non breakable spaces
textData = textData.replaceAll("\\xa0", " "); textData = textData.replaceAll("\\xa0", " ");
mMessage.setText(textData); mMessage.setText(textData);
mDecryptButton.setText(R.string.btn_verify); mDecryptButton.setText(R.string.btn_verify);
} else { } else {
Log.d(Constants.tag, "Nothing matched!"); Log.d(Constants.TAG, "Nothing matched!");
} }
} }
} }
@ -377,7 +377,7 @@ public class DecryptActivity extends BaseActivity {
if (filename.endsWith(".asc") || filename.endsWith(".gpg") || filename.endsWith(".pgp")) { if (filename.endsWith(".asc") || filename.endsWith(".gpg") || filename.endsWith(".pgp")) {
filename = filename.substring(0, filename.length() - 4); filename = filename.substring(0, filename.length() - 4);
} }
mOutputFilename = Constants.path.app_dir + "/" + filename; mOutputFilename = Constants.path.APP_DIR + "/" + filename;
} }
private void updateSource() { private void updateSource() {
@ -564,7 +564,7 @@ public class DecryptActivity extends BaseActivity {
error = "" + e; error = "" + e;
} }
data.putInt(Constants.extras.status, Id.message.done); data.putInt(Constants.extras.STATUS, Id.message.done);
if (error != null) { if (error != null) {
data.putString(Apg.EXTRA_ERROR, error); data.putString(Apg.EXTRA_ERROR, error);
@ -581,8 +581,8 @@ public class DecryptActivity extends BaseActivity {
return; return;
} }
if (data.getInt(Constants.extras.status) == Id.message.unknown_signature_key) { if (data.getInt(Constants.extras.STATUS) == Id.message.unknown_signature_key) {
mUnknownSignatureKeyId = data.getLong(Constants.extras.key_id); mUnknownSignatureKeyId = data.getLong(Constants.extras.KEY_ID);
showDialog(Id.dialog.lookup_unknown_key); showDialog(Id.dialog.lookup_unknown_key);
return; return;
} }

View File

@ -257,7 +257,7 @@ public class EditKeyActivity extends BaseActivity implements OnClickListener {
error = "" + e; error = "" + e;
} }
data.putInt(Constants.extras.status, Id.message.done); data.putInt(Constants.extras.STATUS, Id.message.done);
if (error != null) { if (error != null) {
data.putString(Apg.EXTRA_ERROR, error); data.putString(Apg.EXTRA_ERROR, error);

View File

@ -421,7 +421,7 @@ public class EncryptActivity extends BaseActivity {
mInputFilename = mFilename.getText().toString(); mInputFilename = mFilename.getText().toString();
File file = new File(mInputFilename); File file = new File(mInputFilename);
String ending = (mAsciiArmour.isChecked() ? ".asc" : ".gpg"); String ending = (mAsciiArmour.isChecked() ? ".asc" : ".gpg");
mOutputFilename = Constants.path.app_dir + "/" + file.getName() + ending; mOutputFilename = Constants.path.APP_DIR + "/" + file.getName() + ending;
} }
private void updateSource() { private void updateSource() {
@ -731,7 +731,7 @@ public class EncryptActivity extends BaseActivity {
error = "" + e; error = "" + e;
} }
data.putInt(Constants.extras.status, Id.message.done); data.putInt(Constants.extras.STATUS, Id.message.done);
if (error != null) { if (error != null) {
data.putString(Apg.EXTRA_ERROR, error); data.putString(Apg.EXTRA_ERROR, error);

View File

@ -69,11 +69,11 @@ public class ImportFromQRCodeActivity extends BaseActivity {
} catch (QueryException e) { } catch (QueryException e) {
Log.e(TAG, "Failed to query KeyServer", e); Log.e(TAG, "Failed to query KeyServer", e);
status.putString(Apg.EXTRA_ERROR, "Failed to query KeyServer"); status.putString(Apg.EXTRA_ERROR, "Failed to query KeyServer");
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "Failed to query KeyServer", e); Log.e(TAG, "Failed to query KeyServer", e);
status.putString(Apg.EXTRA_ERROR, "Failed to query KeyServer"); status.putString(Apg.EXTRA_ERROR, "Failed to query KeyServer");
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
} }
} }
}; };
@ -107,7 +107,7 @@ public class ImportFromQRCodeActivity extends BaseActivity {
case Id.request.sign_key: { case Id.request.sign_key: {
// signals the end of processing. Signature was either applied, or it wasnt // signals the end of processing. Signature was either applied, or it wasnt
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
msg.setData(status); msg.setData(status);
sendMessage(msg); sendMessage(msg);

View File

@ -74,8 +74,8 @@ public class KeyListActivity extends BaseActivity {
protected int mSelectedItem = -1; protected int mSelectedItem = -1;
protected int mTask = 0; protected int mTask = 0;
protected String mImportFilename = Constants.path.app_dir + "/"; protected String mImportFilename = Constants.path.APP_DIR + "/";
protected String mExportFilename = Constants.path.app_dir + "/"; protected String mExportFilename = Constants.path.APP_DIR + "/";
protected String mImportData; protected String mImportData;
protected boolean mDeleteAfterImport = false; protected boolean mDeleteAfterImport = false;
@ -352,9 +352,9 @@ public class KeyListActivity extends BaseActivity {
mImportData = null; mImportData = null;
if (mTask == Id.task.import_keys) { if (mTask == Id.task.import_keys) {
data.putInt(Constants.extras.status, Id.message.import_done); data.putInt(Constants.extras.STATUS, Id.message.import_done);
} else { } else {
data.putInt(Constants.extras.status, Id.message.export_done); data.putInt(Constants.extras.STATUS, Id.message.export_done);
} }
if (error != null) { if (error != null) {
@ -381,7 +381,7 @@ public class KeyListActivity extends BaseActivity {
Bundle data = msg.getData(); Bundle data = msg.getData();
if (data != null) { if (data != null) {
int type = data.getInt(Constants.extras.status); int type = data.getInt(Constants.extras.STATUS);
switch (type) { switch (type) {
case Id.message.import_done: { case Id.message.import_done: {
removeDialog(Id.dialog.importing); removeDialog(Id.dialog.importing);

View File

@ -144,7 +144,7 @@ public class KeyServerQueryActivity extends BaseActivity {
error = "Too many responses."; error = "Too many responses.";
} }
data.putInt(Constants.extras.status, Id.message.done); data.putInt(Constants.extras.STATUS, Id.message.done);
if (error != null) { if (error != null) {
data.putString(Apg.EXTRA_ERROR, error); data.putString(Apg.EXTRA_ERROR, error);

View File

@ -61,7 +61,7 @@ public class PreferencesActivity extends PreferenceActivity {
addPreferencesFromResource(R.xml.apg_preferences); addPreferencesFromResource(R.xml.apg_preferences);
mLanguage = (ListPreference) findPreference(Constants.pref.language); mLanguage = (ListPreference) findPreference(Constants.pref.LANGUAGE);
Vector<CharSequence> entryVector = new Vector<CharSequence>(Arrays.asList(mLanguage.getEntries())); Vector<CharSequence> entryVector = new Vector<CharSequence>(Arrays.asList(mLanguage.getEntries()));
Vector<CharSequence> entryValueVector = new Vector<CharSequence>(Arrays.asList(mLanguage.getEntryValues())); Vector<CharSequence> entryValueVector = new Vector<CharSequence>(Arrays.asList(mLanguage.getEntryValues()));
String supportedLanguages[] = getResources().getStringArray(R.array.supported_languages); String supportedLanguages[] = getResources().getStringArray(R.array.supported_languages);
@ -90,7 +90,7 @@ public class PreferencesActivity extends PreferenceActivity {
} }
}); });
mPassPhraseCacheTtl = (IntegerListPreference) findPreference(Constants.pref.pass_phrase_cache_ttl); mPassPhraseCacheTtl = (IntegerListPreference) findPreference(Constants.pref.PASS_PHRASE_CACHE_TTL);
mPassPhraseCacheTtl.setValue("" + mPreferences.getPassPhraseCacheTtl()); mPassPhraseCacheTtl.setValue("" + mPreferences.getPassPhraseCacheTtl());
mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry()); mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry());
mPassPhraseCacheTtl.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mPassPhraseCacheTtl.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
@ -105,7 +105,7 @@ public class PreferencesActivity extends PreferenceActivity {
} }
}); });
mEncryptionAlgorithm = (IntegerListPreference) findPreference(Constants.pref.default_encryption_algorithm); mEncryptionAlgorithm = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM);
int valueIds[] = { int valueIds[] = {
PGPEncryptedData.AES_128, PGPEncryptedData.AES_192, PGPEncryptedData.AES_256, PGPEncryptedData.AES_128, PGPEncryptedData.AES_192, PGPEncryptedData.AES_256,
PGPEncryptedData.BLOWFISH, PGPEncryptedData.TWOFISH, PGPEncryptedData.CAST5, PGPEncryptedData.BLOWFISH, PGPEncryptedData.TWOFISH, PGPEncryptedData.CAST5,
@ -135,7 +135,7 @@ public class PreferencesActivity extends PreferenceActivity {
} }
}); });
mHashAlgorithm = (IntegerListPreference) findPreference(Constants.pref.default_hash_algorithm); mHashAlgorithm = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_HASH_ALGORITHM);
valueIds = new int[] { valueIds = new int[] {
HashAlgorithmTags.MD5, HashAlgorithmTags.RIPEMD160, HashAlgorithmTags.SHA1, HashAlgorithmTags.MD5, HashAlgorithmTags.RIPEMD160, HashAlgorithmTags.SHA1,
HashAlgorithmTags.SHA224, HashAlgorithmTags.SHA256, HashAlgorithmTags.SHA384, HashAlgorithmTags.SHA224, HashAlgorithmTags.SHA256, HashAlgorithmTags.SHA384,
@ -165,7 +165,7 @@ public class PreferencesActivity extends PreferenceActivity {
} }
}); });
mMessageCompression = (IntegerListPreference) findPreference(Constants.pref.default_message_compression); mMessageCompression = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_MESSAGE_COMPRESSION);
valueIds = new int[] { valueIds = new int[] {
Id.choice.compression.none, Id.choice.compression.none,
Id.choice.compression.zip, Id.choice.compression.zip,
@ -197,7 +197,7 @@ public class PreferencesActivity extends PreferenceActivity {
} }
}); });
mFileCompression = (IntegerListPreference) findPreference(Constants.pref.default_file_compression); mFileCompression = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_FILE_COMPRESSION);
mFileCompression.setEntries(entries); mFileCompression.setEntries(entries);
mFileCompression.setEntryValues(values); mFileCompression.setEntryValues(values);
mFileCompression.setValue("" + mPreferences.getDefaultFileCompression()); mFileCompression.setValue("" + mPreferences.getDefaultFileCompression());
@ -213,7 +213,7 @@ public class PreferencesActivity extends PreferenceActivity {
} }
}); });
mAsciiArmour = (CheckBoxPreference) findPreference(Constants.pref.default_ascii_armour); mAsciiArmour = (CheckBoxPreference) findPreference(Constants.pref.DEFAULT_ASCII_ARMOUR);
mAsciiArmour.setChecked(mPreferences.getDefaultAsciiArmour()); mAsciiArmour.setChecked(mPreferences.getDefaultAsciiArmour());
mAsciiArmour.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mAsciiArmour.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
{ {
@ -225,7 +225,7 @@ public class PreferencesActivity extends PreferenceActivity {
} }
}); });
mForceV3Signatures = (CheckBoxPreference) findPreference(Constants.pref.force_v3_signatures); mForceV3Signatures = (CheckBoxPreference) findPreference(Constants.pref.FORCE_V3_SIGNATURES);
mForceV3Signatures.setChecked(mPreferences.getForceV3Signatures()); mForceV3Signatures.setChecked(mPreferences.getForceV3Signatures());
mForceV3Signatures.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() mForceV3Signatures.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
{ {
@ -237,7 +237,7 @@ public class PreferencesActivity extends PreferenceActivity {
} }
}); });
mKeyServerPreference = (PreferenceScreen) findPreference(Constants.pref.key_servers); mKeyServerPreference = (PreferenceScreen) findPreference(Constants.pref.KEY_SERVERS);
String servers[] = mPreferences.getKeyServers(); String servers[] = mPreferences.getKeyServers();
mKeyServerPreference.setSummary(getResources().getString(R.string.nKeyServers, servers.length)); mKeyServerPreference.setSummary(getResources().getString(R.string.nKeyServers, servers.length));
mKeyServerPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { mKeyServerPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

View File

@ -40,7 +40,7 @@ import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
public class PublicKeyListActivity extends KeyListActivity { public class PublicKeyListActivity extends KeyListActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
mExportFilename = Constants.path.app_dir + "/pubexport.asc"; mExportFilename = Constants.path.APP_DIR + "/pubexport.asc";
mKeyType = Id.type.public_key; mKeyType = Id.type.public_key;
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
} }

View File

@ -45,7 +45,7 @@ import com.google.zxing.integration.android.IntentIntegrator;
public class SecretKeyListActivity extends KeyListActivity implements OnChildClickListener { public class SecretKeyListActivity extends KeyListActivity implements OnChildClickListener {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
mExportFilename = Constants.path.app_dir + "/secexport.asc"; mExportFilename = Constants.path.APP_DIR + "/secexport.asc";
mKeyType = Id.type.secret_key; mKeyType = Id.type.secret_key;
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mList.setOnChildClickListener(this); mList.setOnChildClickListener(this);

View File

@ -73,7 +73,7 @@ public class SendKeyActivity extends BaseActivity {
} }
} }
data.putInt(Constants.extras.status, Id.message.export_done); data.putInt(Constants.extras.STATUS, Id.message.export_done);
if (error != null) { if (error != null) {
data.putString(Apg.EXTRA_ERROR, error); data.putString(Apg.EXTRA_ERROR, error);

View File

@ -141,7 +141,7 @@ public class SignKeyActivity extends BaseActivity {
status.putString(Apg.EXTRA_ERROR, "Key has already been signed"); status.putString(Apg.EXTRA_ERROR, "Key has already been signed");
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
msg.setData(status); msg.setData(status);
sendMessage(msg); sendMessage(msg);
@ -221,26 +221,26 @@ public class SignKeyActivity extends BaseActivity {
} catch (PGPException e) { } catch (PGPException e) {
Log.e(TAG, "Failed to sign key", e); Log.e(TAG, "Failed to sign key", e);
status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); status.putString(Apg.EXTRA_ERROR, "Failed to sign key");
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
return; return;
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {
Log.e(TAG, "Failed to sign key", e); Log.e(TAG, "Failed to sign key", e);
status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); status.putString(Apg.EXTRA_ERROR, "Failed to sign key");
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
return; return;
} catch (NoSuchProviderException e) { } catch (NoSuchProviderException e) {
Log.e(TAG, "Failed to sign key", e); Log.e(TAG, "Failed to sign key", e);
status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); status.putString(Apg.EXTRA_ERROR, "Failed to sign key");
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
return; return;
} catch (SignatureException e) { } catch (SignatureException e) {
Log.e(TAG, "Failed to sign key", e); Log.e(TAG, "Failed to sign key", e);
status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); status.putString(Apg.EXTRA_ERROR, "Failed to sign key");
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
return; return;
} }
status.putInt(Constants.extras.status, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
msg.setData(status); msg.setData(status);
sendMessage(msg); sendMessage(msg);