adds the android
8
android/Ext/.classpath
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
33
android/Ext/.project
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>Ext</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
17
android/Ext/AndroidManifest.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.ext"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="8"
|
||||
android:targetSdkVersion="17" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/AppTheme" >
|
||||
</application>
|
||||
|
||||
</manifest>
|
17
android/Ext/bin/AndroidManifest.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.ext"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="8"
|
||||
android:targetSdkVersion="17" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/AppTheme" >
|
||||
</application>
|
||||
|
||||
</manifest>
|
4
android/Ext/bin/R.txt
Normal file
@ -0,0 +1,4 @@
|
||||
int drawable ic_launcher 0x7f020000
|
||||
int string app_name 0x7f030000
|
||||
int style AppBaseTheme 0x7f040000
|
||||
int style AppTheme 0x7f040001
|
68
android/Ext/bin/classes/org/json/README
Executable file
@ -0,0 +1,68 @@
|
||||
JSON in Java [package org.json]
|
||||
|
||||
Douglas Crockford
|
||||
douglas@crockford.com
|
||||
|
||||
2011-02-02
|
||||
|
||||
|
||||
JSON is a light-weight, language independent, data interchange format.
|
||||
See http://www.JSON.org/
|
||||
|
||||
The files in this package implement JSON encoders/decoders in Java.
|
||||
It also includes the capability to convert between JSON and XML, HTTP
|
||||
headers, Cookies, and CDL.
|
||||
|
||||
This is a reference implementation. There is a large number of JSON packages
|
||||
in Java. Perhaps someday the Java community will standardize on one. Until
|
||||
then, choose carefully.
|
||||
|
||||
The license includes this restriction: "The software shall be used for good,
|
||||
not evil." If your conscience cannot live with that, then choose a different
|
||||
package.
|
||||
|
||||
The package compiles on Java 1.2 thru Java 1.4.
|
||||
|
||||
|
||||
JSONObject.java: The JSONObject can parse text from a String or a JSONTokener
|
||||
to produce a map-like object. The object provides methods for manipulating its
|
||||
contents, and for producing a JSON compliant object serialization.
|
||||
|
||||
JSONArray.java: The JSONObject can parse text from a String or a JSONTokener
|
||||
to produce a vector-like object. The object provides methods for manipulating
|
||||
its contents, and for producing a JSON compliant array serialization.
|
||||
|
||||
JSONTokener.java: The JSONTokener breaks a text into a sequence of individual
|
||||
tokens. It can be constructed from a String, Reader, or InputStream.
|
||||
|
||||
JSONException.java: The JSONException is the standard exception type thrown
|
||||
by this package.
|
||||
|
||||
|
||||
JSONString.java: The JSONString interface requires a toJSONString method,
|
||||
allowing an object to provide its own serialization.
|
||||
|
||||
JSONStringer.java: The JSONStringer provides a convenient facility for
|
||||
building JSON strings.
|
||||
|
||||
JSONWriter.java: The JSONWriter provides a convenient facility for building
|
||||
JSON text through a writer.
|
||||
|
||||
|
||||
CDL.java: CDL provides support for converting between JSON and comma
|
||||
delimited lists.
|
||||
|
||||
Cookie.java: Cookie provides support for converting between JSON and cookies.
|
||||
|
||||
CookieList.java: CookieList provides support for converting between JSON and
|
||||
cookie lists.
|
||||
|
||||
HTTP.java: HTTP provides support for converting between JSON and HTTP headers.
|
||||
|
||||
HTTPTokener.java: HTTPTokener extends JSONTokener for parsing HTTP headers.
|
||||
|
||||
XML.java: XML provides support for converting between JSON and XML.
|
||||
|
||||
JSONML.java: JSONML provides support for converting between JSONML and XML.
|
||||
|
||||
XMLTokener.java: XMLTokener extends JSONTokener for parsing XML text.
|
BIN
android/Ext/bin/res/drawable-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
android/Ext/bin/res/drawable-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
android/Ext/bin/res/drawable-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
android/Ext/bin/res/drawable-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 18 KiB |
6
android/Ext/gen/com/example/ext/BuildConfig.java
Normal file
@ -0,0 +1,6 @@
|
||||
/** Automatically generated file. DO NOT MODIFY */
|
||||
package com.example.ext;
|
||||
|
||||
public final class BuildConfig {
|
||||
public final static boolean DEBUG = true;
|
||||
}
|
47
android/Ext/gen/com/example/ext/R.java
Normal file
@ -0,0 +1,47 @@
|
||||
/* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||||
*
|
||||
* This class was automatically generated by the
|
||||
* aapt tool from the resource data it found. It
|
||||
* should not be modified by hand.
|
||||
*/
|
||||
|
||||
package com.example.ext;
|
||||
|
||||
public final class R {
|
||||
public static final class attr {
|
||||
}
|
||||
public static final class drawable {
|
||||
public static int ic_launcher=0x7f020000;
|
||||
}
|
||||
public static final class string {
|
||||
public static int app_name=0x7f030000;
|
||||
}
|
||||
public static final class style {
|
||||
/**
|
||||
Base application theme, dependent on API level. This theme is replaced
|
||||
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||
|
||||
|
||||
Theme customizations available in newer API levels can go in
|
||||
res/values-vXX/styles.xml, while customizations related to
|
||||
backward-compatibility can go here.
|
||||
|
||||
|
||||
Base application theme for API 11+. This theme completely replaces
|
||||
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||
|
||||
API 11 theme customizations can go here.
|
||||
|
||||
Base application theme for API 14+. This theme completely replaces
|
||||
AppBaseTheme from BOTH res/values/styles.xml and
|
||||
res/values-v11/styles.xml on API 14+ devices.
|
||||
|
||||
API 14 theme customizations can go here.
|
||||
*/
|
||||
public static int AppBaseTheme=0x7f040000;
|
||||
/** Application theme.
|
||||
All customizations that are NOT specific to a particular API-level can go here.
|
||||
*/
|
||||
public static int AppTheme=0x7f040001;
|
||||
}
|
||||
}
|
BIN
android/Ext/ic_launcher-web.png
Normal file
After Width: | Height: | Size: 50 KiB |
20
android/Ext/proguard-project.txt
Normal file
@ -0,0 +1,20 @@
|
||||
# To enable ProGuard in your project, edit project.properties
|
||||
# to define the proguard.config property as described in that file.
|
||||
#
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the ProGuard
|
||||
# include property in project.properties.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
15
android/Ext/project.properties
Normal file
@ -0,0 +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 edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||
|
||||
# Project target.
|
||||
target=android-17
|
||||
android.library=true
|
BIN
android/Ext/res/drawable-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
android/Ext/res/drawable-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
android/Ext/res/drawable-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
android/Ext/res/drawable-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 24 KiB |
11
android/Ext/res/values-v11/styles.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme for API 11+. This theme completely replaces
|
||||
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
|
||||
<!-- API 11 theme customizations can go here. -->
|
||||
</style>
|
||||
|
||||
</resources>
|
12
android/Ext/res/values-v14/styles.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme for API 14+. This theme completely replaces
|
||||
AppBaseTheme from BOTH res/values/styles.xml and
|
||||
res/values-v11/styles.xml on API 14+ devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
|
||||
<!-- API 14 theme customizations can go here. -->
|
||||
</style>
|
||||
|
||||
</resources>
|
5
android/Ext/res/values/strings.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<resources>
|
||||
|
||||
<string name="app_name">Ext</string>
|
||||
|
||||
</resources>
|
20
android/Ext/res/values/styles.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme, dependent on API level. This theme is replaced
|
||||
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme.Light">
|
||||
<!--
|
||||
Theme customizations available in newer API levels can go in
|
||||
res/values-vXX/styles.xml, while customizations related to
|
||||
backward-compatibility can go here.
|
||||
-->
|
||||
</style>
|
||||
|
||||
<!-- Application theme. -->
|
||||
<style name="AppTheme" parent="AppBaseTheme">
|
||||
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||
</style>
|
||||
|
||||
</resources>
|
1
android/Ext/src/com
Symbolic link
@ -0,0 +1 @@
|
||||
../../../java/ext/jordanzimmerman/src/com
|
1
android/Ext/src/org/bc
Symbolic link
@ -0,0 +1 @@
|
||||
../../../../java/ext/bouncycastle/src/org/bc
|
1
android/Ext/src/org/json
Symbolic link
@ -0,0 +1 @@
|
||||
../../../../java/ext/json/src/org/json
|
8
android/Mailiverse/.classpath
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
56
android/Mailiverse/.cproject
Normal file
@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="com.android.toolchain.gcc.2129629315">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.android.toolchain.gcc.2129629315" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="com.android.toolchain.gcc.2129629315" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
|
||||
<folderInfo id="com.android.toolchain.gcc.2129629315.250464844" name="/" resourcePath="">
|
||||
<toolChain id="com.android.toolchain.gcc.1220756060" name="com.android.toolchain.gcc" superClass="com.android.toolchain.gcc">
|
||||
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="com.android.targetPlatform.492579735" isAbstract="false" superClass="com.android.targetPlatform"/>
|
||||
<builder id="com.android.builder.611520053" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Android Builder" superClass="com.android.builder">
|
||||
<outputEntries>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="obj"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="libs"/>
|
||||
</outputEntries>
|
||||
</builder>
|
||||
<tool id="com.android.gcc.compiler.40786081" name="Android GCC Compiler" superClass="com.android.gcc.compiler">
|
||||
<inputType id="com.android.gcc.inputType.1765261595" superClass="com.android.gcc.inputType"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="jni"/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="Mailiverse.null.1500974706" name="Mailiverse"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="com.android.toolchain.gcc.2129629315;com.android.toolchain.gcc.2129629315.250464844;com.android.gcc.compiler.40786081;com.android.gcc.inputType.1765261595">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.android.AndroidPerProjectProfile"/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="refreshScope" versionNumber="1">
|
||||
<resource resourceType="PROJECT" workspacePath="/Mailiverse"/>
|
||||
</storageModule>
|
||||
</cproject>
|
97
android/Mailiverse/.project
Normal file
@ -0,0 +1,97 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>Mailiverse</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
<dictionary>
|
||||
<key>?children?</key>
|
||||
<value>?name?=outputEntries\|?children?=?name?=entry\\\\\\\|\\\|?name?=entry\\\\\\\|\\\|\||</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>?name?</key>
|
||||
<value></value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.append_environment</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.buildArguments</key>
|
||||
<value></value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.buildCommand</key>
|
||||
<value>ndk-build</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
|
||||
<value>clean</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.contents</key>
|
||||
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
|
||||
<value>false</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.stopOnError</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
37
android/Mailiverse/AndroidManifest.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.benith.mailiverse"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="8"
|
||||
android:targetSdkVersion="17" />
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/AppTheme" >
|
||||
<activity
|
||||
android:name="com.benith.mailiverse.MainActivity"
|
||||
android:label="@string/app_name" android:parentActivityName="com.benith.mailiverse.LoginActivity">
|
||||
</activity>
|
||||
<activity
|
||||
android:name="com.benith.mailiverse.LoginActivity"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="adjustResize|stateVisible" >
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="com.benith.mailiverse.ConversationActivity"
|
||||
android:label="@string/title_activity_conversation" android:parentActivityName="com.benith.mailiverse.MainActivity">
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
37
android/Mailiverse/bin/AndroidManifest.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.benith.mailiverse"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="8"
|
||||
android:targetSdkVersion="17" />
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/AppTheme" >
|
||||
<activity
|
||||
android:name="com.benith.mailiverse.MainActivity"
|
||||
android:label="@string/app_name" android:parentActivityName="com.benith.mailiverse.LoginActivity">
|
||||
</activity>
|
||||
<activity
|
||||
android:name="com.benith.mailiverse.LoginActivity"
|
||||
android:label="@string/app_name"
|
||||
android:windowSoftInputMode="adjustResize|stateVisible" >
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="com.benith.mailiverse.ConversationActivity"
|
||||
android:label="@string/title_activity_conversation" android:parentActivityName="com.benith.mailiverse.MainActivity">
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
113
android/Mailiverse/bin/R.txt
Normal file
@ -0,0 +1,113 @@
|
||||
int anim back_enter 0x7f040000
|
||||
int anim back_leave 0x7f040001
|
||||
int anim forward_enter 0x7f040002
|
||||
int anim forward_leave 0x7f040003
|
||||
int attr behindOffset 0x7f010003
|
||||
int attr behindScrollScale 0x7f010005
|
||||
int attr behindWidth 0x7f010004
|
||||
int attr fadeDegree 0x7f01000b
|
||||
int attr fadeEnabled 0x7f01000a
|
||||
int attr mode 0x7f010000
|
||||
int attr selectorDrawable 0x7f01000d
|
||||
int attr selectorEnabled 0x7f01000c
|
||||
int attr shadowDrawable 0x7f010008
|
||||
int attr shadowWidth 0x7f010009
|
||||
int attr touchModeAbove 0x7f010006
|
||||
int attr touchModeBehind 0x7f010007
|
||||
int attr viewAbove 0x7f010001
|
||||
int attr viewBehind 0x7f010002
|
||||
int dimen activity_horizontal_margin 0x7f080000
|
||||
int dimen activity_vertical_margin 0x7f080001
|
||||
int drawable ic_launcher 0x7f020000
|
||||
int drawable spiral_galaxy_bg 0x7f020001
|
||||
int id LinearLayout1 0x7f070017
|
||||
int id LinearLayout2 0x7f070010
|
||||
int id RelativeLayout1 0x7f070012
|
||||
int id action_forgot_password 0x7f070027
|
||||
int id action_settings 0x7f070026
|
||||
int id conversationBackButton 0x7f070006
|
||||
int id conversationBrief 0x7f070016
|
||||
int id conversationCheck 0x7f070011
|
||||
int id conversationDate 0x7f070013
|
||||
int id conversationList 0x7f070019
|
||||
int id conversationName 0x7f070014
|
||||
int id conversationSubject 0x7f070015
|
||||
int id email 0x7f07000c
|
||||
int id folderList 0x7f070023
|
||||
int id folderName 0x7f07001a
|
||||
int id folderQuantity 0x7f07001b
|
||||
int id folderRevealButton 0x7f070018
|
||||
int id fullscreen 0x7f070003
|
||||
int id left 0x7f070000
|
||||
int id login 0x7f07000e
|
||||
int id login_background 0x7f070008
|
||||
int id login_form 0x7f07000b
|
||||
int id login_status 0x7f070009
|
||||
int id login_status_message 0x7f07000a
|
||||
int id mailAuthor 0x7f07001d
|
||||
int id mailBody 0x7f070020
|
||||
int id mailDate 0x7f07001e
|
||||
int id mailList 0x7f070007
|
||||
int id mailRecipients 0x7f07001f
|
||||
int id mailSubject 0x7f07001c
|
||||
int id mails 0x7f070005
|
||||
int id margin 0x7f070002
|
||||
int id menu_settings 0x7f070025
|
||||
int id password 0x7f07000d
|
||||
int id revealLogout 0x7f070021
|
||||
int id revealUserName 0x7f070022
|
||||
int id right 0x7f070001
|
||||
int id selected_view 0x7f070004
|
||||
int id sign_in_button 0x7f07000f
|
||||
int id slidingmenumain 0x7f070024
|
||||
int layout activity_conversation 0x7f030000
|
||||
int layout activity_login 0x7f030001
|
||||
int layout activity_main 0x7f030002
|
||||
int layout conversation_item 0x7f030003
|
||||
int layout folder 0x7f030004
|
||||
int layout folder_item 0x7f030005
|
||||
int layout mail_header_item 0x7f030006
|
||||
int layout mail_item 0x7f030007
|
||||
int layout reveal_folders 0x7f030008
|
||||
int layout slidingmenumain 0x7f030009
|
||||
int menu activity_conversation 0x7f090000
|
||||
int menu activity_folder 0x7f090001
|
||||
int menu activity_main 0x7f090002
|
||||
int menu conversation 0x7f090003
|
||||
int menu login 0x7f090004
|
||||
int string action_forgot_password 0x7f05000c
|
||||
int string action_settings 0x7f050006
|
||||
int string action_sign_in_register 0x7f05000a
|
||||
int string action_sign_in_short 0x7f05000b
|
||||
int string app_name 0x7f050000
|
||||
int string error_field_required 0x7f050011
|
||||
int string error_incorrect_password 0x7f050010
|
||||
int string error_invalid_email 0x7f05000e
|
||||
int string error_invalid_password 0x7f05000f
|
||||
int string hello_world 0x7f050001
|
||||
int string login_progress_signing_in 0x7f05000d
|
||||
int string menu_settings 0x7f050002
|
||||
int string prompt_email 0x7f050008
|
||||
int string prompt_password 0x7f050009
|
||||
int string title_activity_conversation 0x7f050005
|
||||
int string title_activity_folder 0x7f050003
|
||||
int string title_activity_login 0x7f050007
|
||||
int string title_activity_main 0x7f050004
|
||||
int style AppBaseTheme 0x7f060000
|
||||
int style AppTheme 0x7f060001
|
||||
int style LoginFormContainer 0x7f060002
|
||||
int[] styleable SlidingMenu { 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004, 0x7f010005, 0x7f010006, 0x7f010007, 0x7f010008, 0x7f010009, 0x7f01000a, 0x7f01000b, 0x7f01000c, 0x7f01000d }
|
||||
int styleable SlidingMenu_behindOffset 3
|
||||
int styleable SlidingMenu_behindScrollScale 5
|
||||
int styleable SlidingMenu_behindWidth 4
|
||||
int styleable SlidingMenu_fadeDegree 11
|
||||
int styleable SlidingMenu_fadeEnabled 10
|
||||
int styleable SlidingMenu_mode 0
|
||||
int styleable SlidingMenu_selectorDrawable 13
|
||||
int styleable SlidingMenu_selectorEnabled 12
|
||||
int styleable SlidingMenu_shadowDrawable 8
|
||||
int styleable SlidingMenu_shadowWidth 9
|
||||
int styleable SlidingMenu_touchModeAbove 6
|
||||
int styleable SlidingMenu_touchModeBehind 7
|
||||
int styleable SlidingMenu_viewAbove 1
|
||||
int styleable SlidingMenu_viewBehind 2
|
@ -0,0 +1,145 @@
|
||||
package mail.client.core;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.mail.BodyPart;
|
||||
import javax.mail.MessagingException;
|
||||
import javax.mail.Session;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import javax.mail.internet.MimeMultipart;
|
||||
|
||||
import com.sun.mail.util.BASE64DecoderStream;
|
||||
|
||||
import core.util.Arrays;
|
||||
import core.util.LogNull;
|
||||
import core.util.LogNull;
|
||||
import core.util.Pair;
|
||||
import core.util.Streams;
|
||||
import core.util.Triple;
|
||||
|
||||
public class Original
|
||||
{
|
||||
static LogNull log = new LogNull(Original.class);
|
||||
|
||||
String path;
|
||||
boolean loaded;
|
||||
|
||||
Exception exception;
|
||||
byte[] data;
|
||||
|
||||
public Original (String path)
|
||||
{
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public String getPath ()
|
||||
{
|
||||
return path;
|
||||
}
|
||||
|
||||
public void setData (byte[] data)
|
||||
{
|
||||
this.data = data;
|
||||
this.loaded = true;
|
||||
}
|
||||
|
||||
public boolean hasData ()
|
||||
{
|
||||
return data!=null;
|
||||
}
|
||||
|
||||
public String getDataAsString () throws UnsupportedEncodingException
|
||||
{
|
||||
return new String(data);
|
||||
}
|
||||
|
||||
public boolean isLoaded ()
|
||||
{
|
||||
return loaded;
|
||||
}
|
||||
|
||||
public boolean hasException()
|
||||
{
|
||||
return exception!=null;
|
||||
}
|
||||
|
||||
public void setException(Exception exception)
|
||||
{
|
||||
this.exception = exception;
|
||||
this.loaded = true;
|
||||
}
|
||||
|
||||
public Exception getException()
|
||||
{
|
||||
return exception;
|
||||
}
|
||||
|
||||
List<Attachment> attachments;
|
||||
|
||||
public void loadAttachments (Attachments attachments) throws Exception
|
||||
{
|
||||
log.debug("loadAttachments a ", data.length, " "+ new Date());
|
||||
|
||||
Session s = Session.getDefaultInstance(new Properties());
|
||||
MimeMessage message = new MimeMessage(s, new ByteArrayInputStream(data));
|
||||
|
||||
log.debug("loadAttachments b ", new Date());
|
||||
List<Triple<String, String, Object>> contents = new ArrayList<Triple<String, String, Object>>();
|
||||
contents.add(new Triple<String,String,Object>(message.getDisposition(), message.getContentID(), message.getContent()));
|
||||
while (contents.size() > 0)
|
||||
{
|
||||
log.debug("loadAttachments c ", new Date());
|
||||
|
||||
Triple<String, String, Object> p = contents.get(0);
|
||||
contents.remove(0);
|
||||
|
||||
String disposition = p.first;
|
||||
String id = p.second;
|
||||
Object content = p.third;
|
||||
|
||||
if (content instanceof InputStream)
|
||||
{
|
||||
String attachmentId = Attachment.getAttachmentId(disposition, id);
|
||||
|
||||
Attachment attachment = attachments.getAttachment(attachmentId);
|
||||
if (attachment != null)
|
||||
{
|
||||
attachment.setData (Streams.readFullyBytes((InputStream)content));
|
||||
}
|
||||
}
|
||||
else
|
||||
if (content instanceof MimeMultipart)
|
||||
{
|
||||
MimeMultipart m = (MimeMultipart)content;
|
||||
for (int i=0; i<m.getCount(); ++i)
|
||||
{
|
||||
BodyPart b = m.getBodyPart(i);
|
||||
|
||||
contents.add(
|
||||
new Triple<String, String, Object>(
|
||||
Arrays.firstOrNull(b.getHeader("Content-Disposition")),
|
||||
Arrays.firstOrNull(b.getHeader("Content-Id")),
|
||||
b.getContent()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log.debug("loadAttachments d ", new Date());
|
||||
attachments.setLoaded(true);
|
||||
}
|
||||
|
||||
public List<Attachment> getAttachments ()
|
||||
{
|
||||
log.debug("getAttachments", new Date());
|
||||
return attachments;
|
||||
}
|
||||
}
|
6
android/Mailiverse/bin/jarlist.cache
Normal file
@ -0,0 +1,6 @@
|
||||
# cache for current jar dependecy. DO NOT EDIT.
|
||||
# format is <lastModified> <length> <SHA-1> <path>
|
||||
# Encoding is UTF-8
|
||||
1361137686000 385677 b9c504522d97f64025c387493d3989e52bc617bd /Users/tprepscius/Projects/mailiverse/android/Ext/libs/android-support-v4.jar
|
||||
1360712012000 385677 b9c504522d97f64025c387493d3989e52bc617bd /Users/tprepscius/Projects/mailiverse/android/SlidingMenu/library/libs/android-support-v4.jar
|
||||
1361130143000 385677 b9c504522d97f64025c387493d3989e52bc617bd /Users/tprepscius/Projects/mailiverse/android/Mailiverse/libs/android-support-v4.jar
|
BIN
android/Mailiverse/bin/res/drawable-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
android/Mailiverse/bin/res/drawable-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
android/Mailiverse/bin/res/drawable-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
android/Mailiverse/bin/res/drawable-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 18 KiB |
@ -0,0 +1,6 @@
|
||||
/** Automatically generated file. DO NOT MODIFY */
|
||||
package com.benith.mailiverse;
|
||||
|
||||
public final class BuildConfig {
|
||||
public final static boolean DEBUG = true;
|
||||
}
|
517
android/Mailiverse/gen/com/benith/mailiverse/R.java
Normal file
@ -0,0 +1,517 @@
|
||||
/* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||||
*
|
||||
* This class was automatically generated by the
|
||||
* aapt tool from the resource data it found. It
|
||||
* should not be modified by hand.
|
||||
*/
|
||||
|
||||
package com.benith.mailiverse;
|
||||
|
||||
public final class R {
|
||||
public static final class anim {
|
||||
public static final int back_enter=0x7f040000;
|
||||
public static final int back_leave=0x7f040001;
|
||||
public static final int forward_enter=0x7f040002;
|
||||
public static final int forward_leave=0x7f040003;
|
||||
}
|
||||
public static final class attr {
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static final int behindOffset=0x7f010003;
|
||||
/** <p>Must be a floating point value, such as "<code>1.2</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static final int behindScrollScale=0x7f010005;
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static final int behindWidth=0x7f010004;
|
||||
/** <p>Must be a floating point value, such as "<code>1.2</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static final int fadeDegree=0x7f01000b;
|
||||
/** <p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static final int fadeEnabled=0x7f01000a;
|
||||
/** <p>Must be one of the following constant values.</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Constant</th><th>Value</th><th>Description</th></tr>
|
||||
<tr><td><code>left</code></td><td>0</td><td></td></tr>
|
||||
<tr><td><code>right</code></td><td>1</td><td></td></tr>
|
||||
</table>
|
||||
*/
|
||||
public static final int mode=0x7f010000;
|
||||
/** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
*/
|
||||
public static final int selectorDrawable=0x7f01000d;
|
||||
/** <p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static final int selectorEnabled=0x7f01000c;
|
||||
/** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
*/
|
||||
public static final int shadowDrawable=0x7f010008;
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static final int shadowWidth=0x7f010009;
|
||||
/** <p>Must be one of the following constant values.</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Constant</th><th>Value</th><th>Description</th></tr>
|
||||
<tr><td><code>margin</code></td><td>0</td><td></td></tr>
|
||||
<tr><td><code>fullscreen</code></td><td>1</td><td></td></tr>
|
||||
</table>
|
||||
*/
|
||||
public static final int touchModeAbove=0x7f010006;
|
||||
/** <p>Must be one of the following constant values.</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Constant</th><th>Value</th><th>Description</th></tr>
|
||||
<tr><td><code>margin</code></td><td>0</td><td></td></tr>
|
||||
<tr><td><code>fullscreen</code></td><td>1</td><td></td></tr>
|
||||
</table>
|
||||
*/
|
||||
public static final int touchModeBehind=0x7f010007;
|
||||
/** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
*/
|
||||
public static final int viewAbove=0x7f010001;
|
||||
/** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
*/
|
||||
public static final int viewBehind=0x7f010002;
|
||||
}
|
||||
public static final class dimen {
|
||||
/** Default screen margins, per the Android Design guidelines.
|
||||
|
||||
Customize dimensions originally defined in res/values/dimens.xml (such as
|
||||
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
|
||||
|
||||
*/
|
||||
public static final int activity_horizontal_margin=0x7f080000;
|
||||
public static final int activity_vertical_margin=0x7f080001;
|
||||
}
|
||||
public static final class drawable {
|
||||
public static final int ic_launcher=0x7f020000;
|
||||
public static final int spiral_galaxy_bg=0x7f020001;
|
||||
}
|
||||
public static final class id {
|
||||
public static final int LinearLayout1=0x7f070017;
|
||||
public static final int LinearLayout2=0x7f070010;
|
||||
public static final int RelativeLayout1=0x7f070012;
|
||||
public static final int action_forgot_password=0x7f070027;
|
||||
public static final int action_settings=0x7f070026;
|
||||
public static final int conversationBackButton=0x7f070006;
|
||||
public static final int conversationBrief=0x7f070016;
|
||||
public static final int conversationCheck=0x7f070011;
|
||||
public static final int conversationDate=0x7f070013;
|
||||
public static final int conversationList=0x7f070019;
|
||||
public static final int conversationName=0x7f070014;
|
||||
public static final int conversationSubject=0x7f070015;
|
||||
public static final int email=0x7f07000c;
|
||||
public static final int folderList=0x7f070023;
|
||||
public static final int folderName=0x7f07001a;
|
||||
public static final int folderQuantity=0x7f07001b;
|
||||
public static final int folderRevealButton=0x7f070018;
|
||||
public static final int fullscreen=0x7f070003;
|
||||
public static final int left=0x7f070000;
|
||||
public static final int login=0x7f07000e;
|
||||
public static final int login_background=0x7f070008;
|
||||
public static final int login_form=0x7f07000b;
|
||||
public static final int login_status=0x7f070009;
|
||||
public static final int login_status_message=0x7f07000a;
|
||||
public static final int mailAuthor=0x7f07001d;
|
||||
public static final int mailBody=0x7f070020;
|
||||
public static final int mailDate=0x7f07001e;
|
||||
public static final int mailList=0x7f070007;
|
||||
public static final int mailRecipients=0x7f07001f;
|
||||
public static final int mailSubject=0x7f07001c;
|
||||
public static final int mails=0x7f070005;
|
||||
public static final int margin=0x7f070002;
|
||||
public static final int menu_settings=0x7f070025;
|
||||
public static final int password=0x7f07000d;
|
||||
public static final int revealLogout=0x7f070021;
|
||||
public static final int revealUserName=0x7f070022;
|
||||
public static final int right=0x7f070001;
|
||||
public static final int selected_view=0x7f070004;
|
||||
public static final int sign_in_button=0x7f07000f;
|
||||
public static final int slidingmenumain=0x7f070024;
|
||||
}
|
||||
public static final class layout {
|
||||
public static final int activity_conversation=0x7f030000;
|
||||
public static final int activity_login=0x7f030001;
|
||||
public static final int activity_main=0x7f030002;
|
||||
public static final int conversation_item=0x7f030003;
|
||||
public static final int folder=0x7f030004;
|
||||
public static final int folder_item=0x7f030005;
|
||||
public static final int mail_header_item=0x7f030006;
|
||||
public static final int mail_item=0x7f030007;
|
||||
public static final int reveal_folders=0x7f030008;
|
||||
public static final int slidingmenumain=0x7f030009;
|
||||
}
|
||||
public static final class menu {
|
||||
public static final int activity_conversation=0x7f090000;
|
||||
public static final int activity_folder=0x7f090001;
|
||||
public static final int activity_main=0x7f090002;
|
||||
public static final int conversation=0x7f090003;
|
||||
public static final int login=0x7f090004;
|
||||
}
|
||||
public static final class string {
|
||||
public static final int action_forgot_password=0x7f05000c;
|
||||
public static final int action_settings=0x7f050006;
|
||||
public static final int action_sign_in_register=0x7f05000a;
|
||||
public static final int action_sign_in_short=0x7f05000b;
|
||||
public static final int app_name=0x7f050000;
|
||||
public static final int error_field_required=0x7f050011;
|
||||
public static final int error_incorrect_password=0x7f050010;
|
||||
public static final int error_invalid_email=0x7f05000e;
|
||||
public static final int error_invalid_password=0x7f05000f;
|
||||
public static final int hello_world=0x7f050001;
|
||||
public static final int login_progress_signing_in=0x7f05000d;
|
||||
public static final int menu_settings=0x7f050002;
|
||||
/** Strings related to login
|
||||
*/
|
||||
public static final int prompt_email=0x7f050008;
|
||||
public static final int prompt_password=0x7f050009;
|
||||
public static final int title_activity_conversation=0x7f050005;
|
||||
public static final int title_activity_folder=0x7f050003;
|
||||
public static final int title_activity_login=0x7f050007;
|
||||
public static final int title_activity_main=0x7f050004;
|
||||
}
|
||||
public static final class style {
|
||||
/**
|
||||
Base application theme, dependent on API level. This theme is replaced
|
||||
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||
|
||||
|
||||
Theme customizations available in newer API levels can go in
|
||||
res/values-vXX/styles.xml, while customizations related to
|
||||
backward-compatibility can go here.
|
||||
|
||||
|
||||
Base application theme for API 11+. This theme completely replaces
|
||||
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||
|
||||
API 11 theme customizations can go here.
|
||||
|
||||
Base application theme for API 14+. This theme completely replaces
|
||||
AppBaseTheme from BOTH res/values/styles.xml and
|
||||
res/values-v11/styles.xml on API 14+ devices.
|
||||
|
||||
API 14 theme customizations can go here.
|
||||
|
||||
Base application theme, dependent on API level. This theme is replaced
|
||||
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||
|
||||
|
||||
Theme customizations available in newer API levels can go in
|
||||
res/values-vXX/styles.xml, while customizations related to
|
||||
backward-compatibility can go here.
|
||||
|
||||
|
||||
Base application theme for API 11+. This theme completely replaces
|
||||
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||
|
||||
API 11 theme customizations can go here.
|
||||
|
||||
Base application theme for API 14+. This theme completely replaces
|
||||
AppBaseTheme from BOTH res/values/styles.xml and
|
||||
res/values-v11/styles.xml on API 14+ devices.
|
||||
|
||||
API 14 theme customizations can go here.
|
||||
*/
|
||||
public static final int AppBaseTheme=0x7f060000;
|
||||
/** Application theme.
|
||||
All customizations that are NOT specific to a particular API-level can go here.
|
||||
Application theme.
|
||||
All customizations that are NOT specific to a particular API-level can go here.
|
||||
*/
|
||||
public static final int AppTheme=0x7f060001;
|
||||
public static final int LoginFormContainer=0x7f060002;
|
||||
}
|
||||
public static final class styleable {
|
||||
/** Attributes that can be used with a SlidingMenu.
|
||||
<p>Includes the following attributes:</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_behindOffset com.benith.mailiverse:behindOffset}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_behindScrollScale com.benith.mailiverse:behindScrollScale}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_behindWidth com.benith.mailiverse:behindWidth}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_fadeDegree com.benith.mailiverse:fadeDegree}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_fadeEnabled com.benith.mailiverse:fadeEnabled}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_mode com.benith.mailiverse:mode}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_selectorDrawable com.benith.mailiverse:selectorDrawable}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_selectorEnabled com.benith.mailiverse:selectorEnabled}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_shadowDrawable com.benith.mailiverse:shadowDrawable}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_shadowWidth com.benith.mailiverse:shadowWidth}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_touchModeAbove com.benith.mailiverse:touchModeAbove}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_touchModeBehind com.benith.mailiverse:touchModeBehind}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_viewAbove com.benith.mailiverse:viewAbove}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SlidingMenu_viewBehind com.benith.mailiverse:viewBehind}</code></td><td></td></tr>
|
||||
</table>
|
||||
@see #SlidingMenu_behindOffset
|
||||
@see #SlidingMenu_behindScrollScale
|
||||
@see #SlidingMenu_behindWidth
|
||||
@see #SlidingMenu_fadeDegree
|
||||
@see #SlidingMenu_fadeEnabled
|
||||
@see #SlidingMenu_mode
|
||||
@see #SlidingMenu_selectorDrawable
|
||||
@see #SlidingMenu_selectorEnabled
|
||||
@see #SlidingMenu_shadowDrawable
|
||||
@see #SlidingMenu_shadowWidth
|
||||
@see #SlidingMenu_touchModeAbove
|
||||
@see #SlidingMenu_touchModeBehind
|
||||
@see #SlidingMenu_viewAbove
|
||||
@see #SlidingMenu_viewBehind
|
||||
*/
|
||||
public static final int[] SlidingMenu = {
|
||||
0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003,
|
||||
0x7f010004, 0x7f010005, 0x7f010006, 0x7f010007,
|
||||
0x7f010008, 0x7f010009, 0x7f01000a, 0x7f01000b,
|
||||
0x7f01000c, 0x7f01000d
|
||||
};
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#behindOffset}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name android:behindOffset
|
||||
*/
|
||||
public static final int SlidingMenu_behindOffset = 3;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#behindScrollScale}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a floating point value, such as "<code>1.2</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name android:behindScrollScale
|
||||
*/
|
||||
public static final int SlidingMenu_behindScrollScale = 5;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#behindWidth}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name android:behindWidth
|
||||
*/
|
||||
public static final int SlidingMenu_behindWidth = 4;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#fadeDegree}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a floating point value, such as "<code>1.2</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name android:fadeDegree
|
||||
*/
|
||||
public static final int SlidingMenu_fadeDegree = 11;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#fadeEnabled}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name android:fadeEnabled
|
||||
*/
|
||||
public static final int SlidingMenu_fadeEnabled = 10;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#mode}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be one of the following constant values.</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Constant</th><th>Value</th><th>Description</th></tr>
|
||||
<tr><td><code>left</code></td><td>0</td><td></td></tr>
|
||||
<tr><td><code>right</code></td><td>1</td><td></td></tr>
|
||||
</table>
|
||||
@attr name android:mode
|
||||
*/
|
||||
public static final int SlidingMenu_mode = 0;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#selectorDrawable}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
@attr name android:selectorDrawable
|
||||
*/
|
||||
public static final int SlidingMenu_selectorDrawable = 13;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#selectorEnabled}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name android:selectorEnabled
|
||||
*/
|
||||
public static final int SlidingMenu_selectorEnabled = 12;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#shadowDrawable}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
@attr name android:shadowDrawable
|
||||
*/
|
||||
public static final int SlidingMenu_shadowDrawable = 8;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#shadowWidth}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name android:shadowWidth
|
||||
*/
|
||||
public static final int SlidingMenu_shadowWidth = 9;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#touchModeAbove}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be one of the following constant values.</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Constant</th><th>Value</th><th>Description</th></tr>
|
||||
<tr><td><code>margin</code></td><td>0</td><td></td></tr>
|
||||
<tr><td><code>fullscreen</code></td><td>1</td><td></td></tr>
|
||||
</table>
|
||||
@attr name android:touchModeAbove
|
||||
*/
|
||||
public static final int SlidingMenu_touchModeAbove = 6;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#touchModeBehind}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be one of the following constant values.</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Constant</th><th>Value</th><th>Description</th></tr>
|
||||
<tr><td><code>margin</code></td><td>0</td><td></td></tr>
|
||||
<tr><td><code>fullscreen</code></td><td>1</td><td></td></tr>
|
||||
</table>
|
||||
@attr name android:touchModeBehind
|
||||
*/
|
||||
public static final int SlidingMenu_touchModeBehind = 7;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#viewAbove}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
@attr name android:viewAbove
|
||||
*/
|
||||
public static final int SlidingMenu_viewAbove = 1;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.benith.mailiverse.R.attr#viewBehind}
|
||||
attribute's value can be found in the {@link #SlidingMenu} array.
|
||||
|
||||
|
||||
<p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
@attr name android:viewBehind
|
||||
*/
|
||||
public static final int SlidingMenu_viewBehind = 2;
|
||||
};
|
||||
}
|
20
android/Mailiverse/gen/com/example/ext/R.java
Normal file
@ -0,0 +1,20 @@
|
||||
/* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||||
*
|
||||
* This class was automatically generated by the
|
||||
* aapt tool from the resource data it found. It
|
||||
* should not be modified by hand.
|
||||
*/
|
||||
package com.example.ext;
|
||||
|
||||
public final class R {
|
||||
public static final class style {
|
||||
public static final int AppBaseTheme = 0x7f060000;
|
||||
public static final int AppTheme = 0x7f060001;
|
||||
}
|
||||
public static final class string {
|
||||
public static final int app_name = 0x7f050000;
|
||||
}
|
||||
public static final class drawable {
|
||||
public static final int ic_launcher = 0x7f020000;
|
||||
}
|
||||
}
|
BIN
android/Mailiverse/ic_launcher-web.png
Normal file
After Width: | Height: | Size: 43 KiB |
11
android/Mailiverse/jni/Android.mk
Normal file
@ -0,0 +1,11 @@
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := Mailiverse
|
||||
LOCAL_SRC_FILES := \
|
||||
Mailiverse.cpp \
|
||||
core_crypt_PBEPlatformNative.c \
|
||||
sha256.c
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
1
android/Mailiverse/jni/Application.mk
Normal file
@ -0,0 +1 @@
|
||||
APP_ABI := all
|
1
android/Mailiverse/jni/Mailiverse.cpp
Normal file
@ -0,0 +1 @@
|
||||
#include <jni.h>
|
30
android/Mailiverse/jni/core_crypt_PBEPlatformNative.c
Normal file
@ -0,0 +1,30 @@
|
||||
#include "core_crypt_PBEPlatformNative.h"
|
||||
|
||||
// downloaded from https://github.com/johanns/PBKDF256/tree/master/ext/core
|
||||
#include "sha256.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
JNIEXPORT jbyteArray JNICALL Java_core_crypt_PBEPlatformNative_generate
|
||||
(JNIEnv *jenv, jclass jclazz, jstring jpassword, jbyteArray jsalt, jint jiterations, jint jkeyLengthBits)
|
||||
{
|
||||
jboolean isCopy;
|
||||
const char *password = (*jenv)->GetStringUTFChars(jenv, jpassword, 0);
|
||||
jbyte *salt = (*jenv)->GetByteArrayElements (jenv, jsalt, &isCopy);
|
||||
jint saltLength = (*jenv)->GetArrayLength(jenv, jsalt);
|
||||
|
||||
int keyLengthBytes = jkeyLengthBits/8;
|
||||
unsigned char *out = malloc(keyLengthBytes);
|
||||
|
||||
const uint8_t *ucSalt = (const uint8_t *)salt;
|
||||
const uint8_t *ucPassword = (const uint8_t *)password;
|
||||
uint64_t u64Iterations = (uint64_t)jiterations;
|
||||
s_PBKDF2_SHA256 (password, strlen(password), ucSalt, saltLength, u64Iterations, out, keyLengthBytes);
|
||||
|
||||
jbyteArray jout = (*jenv)->NewByteArray (jenv, keyLengthBytes);
|
||||
(*jenv)->SetByteArrayRegion (jenv, jout, 0, keyLengthBytes, out);
|
||||
free (out);
|
||||
|
||||
(*jenv)->ReleaseByteArrayElements (jenv, jsalt, salt, isCopy);
|
||||
|
||||
return jout;
|
||||
}
|
21
android/Mailiverse/jni/core_crypt_PBEPlatformNative.h
Normal file
@ -0,0 +1,21 @@
|
||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||
#include <jni.h>
|
||||
/* Header for class core_crypt_PBEPlatform */
|
||||
|
||||
#ifndef _Included_core_crypt_PBEPlatform
|
||||
#define _Included_core_crypt_PBEPlatform
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/*
|
||||
* Class: core_crypt_PBEPlatform
|
||||
* Method: generate
|
||||
* Signature: (Ljava/lang/String;[BII)[B
|
||||
*/
|
||||
JNIEXPORT jbyteArray JNICALL Java_core_crypt_PBEPlatformNative_generate
|
||||
(JNIEnv *, jclass, jstring, jbyteArray, jint, jint);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
4
android/Mailiverse/jni/scrypt_platform.h
Normal file
@ -0,0 +1,4 @@
|
||||
#ifndef _SCRYPT_PLATFORM_H_
|
||||
#define _SCRYPT_PLATFORM_H_
|
||||
|
||||
#endif /* !_SCRYPT_PLATFORM_H_ */
|
421
android/Mailiverse/jni/sha256.c
Normal file
@ -0,0 +1,421 @@
|
||||
/*-
|
||||
*
|
||||
* WOOOHOOO!!!
|
||||
*
|
||||
* Sept. 25th 2012: Appending prefix to function prototypes to avoid collision with
|
||||
* OpenSSL methods when requiring openssl module in Ruby which causes the VM to crash!
|
||||
*
|
||||
-*/
|
||||
|
||||
/*-
|
||||
* Copyright 2005,2007,2009 Colin Percival
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
|
||||
*/
|
||||
#include "scrypt_platform.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "sysendian.h"
|
||||
|
||||
#include "sha256.h"
|
||||
|
||||
/*
|
||||
* Encode a length len/4 vector of (uint32_t) into a length len vector of
|
||||
* (unsigned char) in big-endian form. Assumes len is a multiple of 4.
|
||||
*/
|
||||
static void
|
||||
be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len / 4; i++)
|
||||
be32enc(dst + i * 4, src[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode a big-endian length len vector of (unsigned char) into a length
|
||||
* len/4 vector of (uint32_t). Assumes len is a multiple of 4.
|
||||
*/
|
||||
static void
|
||||
be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len / 4; i++)
|
||||
dst[i] = be32dec(src + i * 4);
|
||||
}
|
||||
|
||||
/* Elementary functions used by SHA256 */
|
||||
#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
|
||||
#define Maj(x, y, z) ((x & (y | z)) | (y & z))
|
||||
#define SHR(x, n) (x >> n)
|
||||
#define ROTR(x, n) ((x >> n) | (x << (32 - n)))
|
||||
#define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
|
||||
#define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
|
||||
#define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
|
||||
#define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
|
||||
|
||||
/* SHA256 round function */
|
||||
#define RND(a, b, c, d, e, f, g, h, k) \
|
||||
t0 = h + S1(e) + Ch(e, f, g) + k; \
|
||||
t1 = S0(a) + Maj(a, b, c); \
|
||||
d += t0; \
|
||||
h = t0 + t1;
|
||||
|
||||
/* Adjusted round function for rotating state */
|
||||
#define RNDr(S, W, i, k) \
|
||||
RND(S[(64 - i) % 8], S[(65 - i) % 8], \
|
||||
S[(66 - i) % 8], S[(67 - i) % 8], \
|
||||
S[(68 - i) % 8], S[(69 - i) % 8], \
|
||||
S[(70 - i) % 8], S[(71 - i) % 8], \
|
||||
W[i] + k)
|
||||
|
||||
/*
|
||||
* SHA256 block compression function. The 256-bit state is transformed via
|
||||
* the 512-bit input block to produce a new state.
|
||||
*/
|
||||
static void
|
||||
SHA256_Transform(uint32_t * state, const unsigned char block[64])
|
||||
{
|
||||
uint32_t W[64];
|
||||
uint32_t S[8];
|
||||
uint32_t t0, t1;
|
||||
int i;
|
||||
|
||||
/* 1. Prepare message schedule W. */
|
||||
be32dec_vect(W, block, 64);
|
||||
for (i = 16; i < 64; i++)
|
||||
W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
|
||||
|
||||
/* 2. Initialize working variables. */
|
||||
memcpy(S, state, 32);
|
||||
|
||||
/* 3. Mix. */
|
||||
RNDr(S, W, 0, 0x428a2f98);
|
||||
RNDr(S, W, 1, 0x71374491);
|
||||
RNDr(S, W, 2, 0xb5c0fbcf);
|
||||
RNDr(S, W, 3, 0xe9b5dba5);
|
||||
RNDr(S, W, 4, 0x3956c25b);
|
||||
RNDr(S, W, 5, 0x59f111f1);
|
||||
RNDr(S, W, 6, 0x923f82a4);
|
||||
RNDr(S, W, 7, 0xab1c5ed5);
|
||||
RNDr(S, W, 8, 0xd807aa98);
|
||||
RNDr(S, W, 9, 0x12835b01);
|
||||
RNDr(S, W, 10, 0x243185be);
|
||||
RNDr(S, W, 11, 0x550c7dc3);
|
||||
RNDr(S, W, 12, 0x72be5d74);
|
||||
RNDr(S, W, 13, 0x80deb1fe);
|
||||
RNDr(S, W, 14, 0x9bdc06a7);
|
||||
RNDr(S, W, 15, 0xc19bf174);
|
||||
RNDr(S, W, 16, 0xe49b69c1);
|
||||
RNDr(S, W, 17, 0xefbe4786);
|
||||
RNDr(S, W, 18, 0x0fc19dc6);
|
||||
RNDr(S, W, 19, 0x240ca1cc);
|
||||
RNDr(S, W, 20, 0x2de92c6f);
|
||||
RNDr(S, W, 21, 0x4a7484aa);
|
||||
RNDr(S, W, 22, 0x5cb0a9dc);
|
||||
RNDr(S, W, 23, 0x76f988da);
|
||||
RNDr(S, W, 24, 0x983e5152);
|
||||
RNDr(S, W, 25, 0xa831c66d);
|
||||
RNDr(S, W, 26, 0xb00327c8);
|
||||
RNDr(S, W, 27, 0xbf597fc7);
|
||||
RNDr(S, W, 28, 0xc6e00bf3);
|
||||
RNDr(S, W, 29, 0xd5a79147);
|
||||
RNDr(S, W, 30, 0x06ca6351);
|
||||
RNDr(S, W, 31, 0x14292967);
|
||||
RNDr(S, W, 32, 0x27b70a85);
|
||||
RNDr(S, W, 33, 0x2e1b2138);
|
||||
RNDr(S, W, 34, 0x4d2c6dfc);
|
||||
RNDr(S, W, 35, 0x53380d13);
|
||||
RNDr(S, W, 36, 0x650a7354);
|
||||
RNDr(S, W, 37, 0x766a0abb);
|
||||
RNDr(S, W, 38, 0x81c2c92e);
|
||||
RNDr(S, W, 39, 0x92722c85);
|
||||
RNDr(S, W, 40, 0xa2bfe8a1);
|
||||
RNDr(S, W, 41, 0xa81a664b);
|
||||
RNDr(S, W, 42, 0xc24b8b70);
|
||||
RNDr(S, W, 43, 0xc76c51a3);
|
||||
RNDr(S, W, 44, 0xd192e819);
|
||||
RNDr(S, W, 45, 0xd6990624);
|
||||
RNDr(S, W, 46, 0xf40e3585);
|
||||
RNDr(S, W, 47, 0x106aa070);
|
||||
RNDr(S, W, 48, 0x19a4c116);
|
||||
RNDr(S, W, 49, 0x1e376c08);
|
||||
RNDr(S, W, 50, 0x2748774c);
|
||||
RNDr(S, W, 51, 0x34b0bcb5);
|
||||
RNDr(S, W, 52, 0x391c0cb3);
|
||||
RNDr(S, W, 53, 0x4ed8aa4a);
|
||||
RNDr(S, W, 54, 0x5b9cca4f);
|
||||
RNDr(S, W, 55, 0x682e6ff3);
|
||||
RNDr(S, W, 56, 0x748f82ee);
|
||||
RNDr(S, W, 57, 0x78a5636f);
|
||||
RNDr(S, W, 58, 0x84c87814);
|
||||
RNDr(S, W, 59, 0x8cc70208);
|
||||
RNDr(S, W, 60, 0x90befffa);
|
||||
RNDr(S, W, 61, 0xa4506ceb);
|
||||
RNDr(S, W, 62, 0xbef9a3f7);
|
||||
RNDr(S, W, 63, 0xc67178f2);
|
||||
|
||||
/* 4. Mix local working variables into global state */
|
||||
for (i = 0; i < 8; i++)
|
||||
state[i] += S[i];
|
||||
|
||||
/* Clean the stack. */
|
||||
memset(W, 0, 256);
|
||||
memset(S, 0, 32);
|
||||
t0 = t1 = 0;
|
||||
}
|
||||
|
||||
static unsigned char PAD[64] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
/* Add padding and terminating bit-count. */
|
||||
static void
|
||||
SHA256_Pad(SHA256_CTX * ctx)
|
||||
{
|
||||
unsigned char len[8];
|
||||
uint32_t r, plen;
|
||||
|
||||
/*
|
||||
* Convert length to a vector of bytes -- we do this now rather
|
||||
* than later because the length will change after we pad.
|
||||
*/
|
||||
be32enc_vect(len, ctx->count, 8);
|
||||
|
||||
/* Add 1--64 bytes so that the resulting length is 56 mod 64 */
|
||||
r = (ctx->count[1] >> 3) & 0x3f;
|
||||
plen = (r < 56) ? (56 - r) : (120 - r);
|
||||
s_SHA256_Update(ctx, PAD, (size_t)plen);
|
||||
|
||||
/* Add the terminating bit-count */
|
||||
s_SHA256_Update(ctx, len, 8);
|
||||
}
|
||||
|
||||
/* SHA-256 initialization. Begins a SHA-256 operation. */
|
||||
void
|
||||
s_SHA256_Init(SHA256_CTX * ctx)
|
||||
{
|
||||
|
||||
/* Zero bits processed so far */
|
||||
ctx->count[0] = ctx->count[1] = 0;
|
||||
|
||||
/* Magic initialization constants */
|
||||
ctx->state[0] = 0x6A09E667;
|
||||
ctx->state[1] = 0xBB67AE85;
|
||||
ctx->state[2] = 0x3C6EF372;
|
||||
ctx->state[3] = 0xA54FF53A;
|
||||
ctx->state[4] = 0x510E527F;
|
||||
ctx->state[5] = 0x9B05688C;
|
||||
ctx->state[6] = 0x1F83D9AB;
|
||||
ctx->state[7] = 0x5BE0CD19;
|
||||
}
|
||||
|
||||
/* Add bytes into the hash */
|
||||
void
|
||||
s_SHA256_Update(SHA256_CTX * ctx, const void *in, size_t len)
|
||||
{
|
||||
uint32_t bitlen[2];
|
||||
uint32_t r;
|
||||
const unsigned char *src = in;
|
||||
|
||||
/* Number of bytes left in the buffer from previous updates */
|
||||
r = (ctx->count[1] >> 3) & 0x3f;
|
||||
|
||||
/* Convert the length into a number of bits */
|
||||
bitlen[1] = ((uint32_t)len) << 3;
|
||||
bitlen[0] = (uint32_t)(len >> 29);
|
||||
|
||||
/* Update number of bits */
|
||||
if ((ctx->count[1] += bitlen[1]) < bitlen[1])
|
||||
ctx->count[0]++;
|
||||
ctx->count[0] += bitlen[0];
|
||||
|
||||
/* Handle the case where we don't need to perform any transforms */
|
||||
if (len < 64 - r) {
|
||||
memcpy(&ctx->buf[r], src, len);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Finish the current block */
|
||||
memcpy(&ctx->buf[r], src, 64 - r);
|
||||
SHA256_Transform(ctx->state, ctx->buf);
|
||||
src += 64 - r;
|
||||
len -= 64 - r;
|
||||
|
||||
/* Perform complete blocks */
|
||||
while (len >= 64) {
|
||||
SHA256_Transform(ctx->state, src);
|
||||
src += 64;
|
||||
len -= 64;
|
||||
}
|
||||
|
||||
/* Copy left over data into buffer */
|
||||
memcpy(ctx->buf, src, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* SHA-256 finalization. Pads the input data, exports the hash value,
|
||||
* and clears the context state.
|
||||
*/
|
||||
void
|
||||
s_SHA256_Final(unsigned char digest[32], SHA256_CTX * ctx)
|
||||
{
|
||||
|
||||
/* Add padding */
|
||||
SHA256_Pad(ctx);
|
||||
|
||||
/* Write the hash */
|
||||
be32enc_vect(digest, ctx->state, 32);
|
||||
|
||||
/* Clear the context state */
|
||||
memset((void *)ctx, 0, sizeof(*ctx));
|
||||
}
|
||||
|
||||
/* Initialize an HMAC-SHA256 operation with the given key. */
|
||||
void
|
||||
s_HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen)
|
||||
{
|
||||
unsigned char pad[64];
|
||||
unsigned char khash[32];
|
||||
const unsigned char * K = _K;
|
||||
size_t i;
|
||||
|
||||
/* If Klen > 64, the key is really SHA256(K). */
|
||||
if (Klen > 64) {
|
||||
s_SHA256_Init(&ctx->ictx);
|
||||
s_SHA256_Update(&ctx->ictx, K, Klen);
|
||||
s_SHA256_Final(khash, &ctx->ictx);
|
||||
K = khash;
|
||||
Klen = 32;
|
||||
}
|
||||
|
||||
/* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */
|
||||
s_SHA256_Init(&ctx->ictx);
|
||||
memset(pad, 0x36, 64);
|
||||
for (i = 0; i < Klen; i++)
|
||||
pad[i] ^= K[i];
|
||||
s_SHA256_Update(&ctx->ictx, pad, 64);
|
||||
|
||||
/* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */
|
||||
s_SHA256_Init(&ctx->octx);
|
||||
memset(pad, 0x5c, 64);
|
||||
for (i = 0; i < Klen; i++)
|
||||
pad[i] ^= K[i];
|
||||
s_SHA256_Update(&ctx->octx, pad, 64);
|
||||
|
||||
/* Clean the stack. */
|
||||
memset(khash, 0, 32);
|
||||
}
|
||||
|
||||
/* Add bytes to the HMAC-SHA256 operation. */
|
||||
void
|
||||
s_HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void *in, size_t len)
|
||||
{
|
||||
|
||||
/* Feed data to the inner SHA256 operation. */
|
||||
s_SHA256_Update(&ctx->ictx, in, len);
|
||||
}
|
||||
|
||||
/* Finish an HMAC-SHA256 operation. */
|
||||
void
|
||||
s_HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX * ctx)
|
||||
{
|
||||
unsigned char ihash[32];
|
||||
|
||||
/* Finish the inner SHA256 operation. */
|
||||
s_SHA256_Final(ihash, &ctx->ictx);
|
||||
|
||||
/* Feed the inner hash to the outer SHA256 operation. */
|
||||
s_SHA256_Update(&ctx->octx, ihash, 32);
|
||||
|
||||
/* Finish the outer SHA256 operation. */
|
||||
s_SHA256_Final(digest, &ctx->octx);
|
||||
|
||||
/* Clean the stack. */
|
||||
memset(ihash, 0, 32);
|
||||
}
|
||||
|
||||
/**
|
||||
* s_PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
|
||||
* Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
|
||||
* write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
|
||||
*/
|
||||
void
|
||||
s_PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
|
||||
size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen)
|
||||
{
|
||||
HMAC_SHA256_CTX PShctx, hctx;
|
||||
size_t i;
|
||||
uint8_t ivec[4];
|
||||
uint8_t U[32];
|
||||
uint8_t T[32];
|
||||
uint64_t j;
|
||||
int k;
|
||||
size_t clen;
|
||||
|
||||
/* Compute HMAC state after processing P and S. */
|
||||
s_HMAC_SHA256_Init(&PShctx, passwd, passwdlen);
|
||||
s_HMAC_SHA256_Update(&PShctx, salt, saltlen);
|
||||
|
||||
/* Iterate through the blocks. */
|
||||
for (i = 0; i * 32 < dkLen; i++) {
|
||||
/* Generate INT(i + 1). */
|
||||
be32enc(ivec, (uint32_t)(i + 1));
|
||||
|
||||
/* Compute U_1 = PRF(P, S || INT(i)). */
|
||||
memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));
|
||||
s_HMAC_SHA256_Update(&hctx, ivec, 4);
|
||||
s_HMAC_SHA256_Final(U, &hctx);
|
||||
|
||||
/* T_i = U_1 ... */
|
||||
memcpy(T, U, 32);
|
||||
|
||||
for (j = 2; j <= c; j++) {
|
||||
/* Compute U_j. */
|
||||
s_HMAC_SHA256_Init(&hctx, passwd, passwdlen);
|
||||
s_HMAC_SHA256_Update(&hctx, U, 32);
|
||||
s_HMAC_SHA256_Final(U, &hctx);
|
||||
|
||||
/* ... xor U_j ... */
|
||||
for (k = 0; k < 32; k++)
|
||||
T[k] ^= U[k];
|
||||
}
|
||||
|
||||
/* Copy as many bytes as necessary into buf. */
|
||||
clen = dkLen - i * 32;
|
||||
if (clen > 32)
|
||||
clen = 32;
|
||||
memcpy(&buf[i * 32], T, clen);
|
||||
}
|
||||
|
||||
/* Clean PShctx, since we never called _Final on it. */
|
||||
memset(&PShctx, 0, sizeof(HMAC_SHA256_CTX));
|
||||
}
|
71
android/Mailiverse/jni/sha256.h
Normal file
@ -0,0 +1,71 @@
|
||||
/*-
|
||||
*
|
||||
* WOOOHOOO!!!
|
||||
*
|
||||
* Sept. 25th 2012: Appending prefix to function prototypes to avoid collision with
|
||||
* OpenSSL methods when requiring openssl module in Ruby which causes the VM to crash!
|
||||
*
|
||||
-*/
|
||||
|
||||
/*-
|
||||
* Copyright 2005,2007,2009 Colin Percival
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
|
||||
*
|
||||
* $FreeBSD: src/lib/libmd/sha256.h,v 1.2 2006/01/17 15:35:56 phk Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SHA256_H_
|
||||
#define _SHA256_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct SHA256Context {
|
||||
uint32_t state[8];
|
||||
uint32_t count[2];
|
||||
unsigned char buf[64];
|
||||
} SHA256_CTX;
|
||||
|
||||
typedef struct HMAC_SHA256Context {
|
||||
SHA256_CTX ictx;
|
||||
SHA256_CTX octx;
|
||||
} HMAC_SHA256_CTX;
|
||||
|
||||
void s_SHA256_Init(SHA256_CTX *);
|
||||
void s_SHA256_Update(SHA256_CTX *, const void *, size_t);
|
||||
void s_SHA256_Final(unsigned char [32], SHA256_CTX *);
|
||||
void s_HMAC_SHA256_Init(HMAC_SHA256_CTX *, const void *, size_t);
|
||||
void s_HMAC_SHA256_Update(HMAC_SHA256_CTX *, const void *, size_t);
|
||||
void s_HMAC_SHA256_Final(unsigned char [32], HMAC_SHA256_CTX *);
|
||||
|
||||
/**
|
||||
* s_PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
|
||||
* Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
|
||||
* write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
|
||||
*/
|
||||
void s_PBKDF2_SHA256(const uint8_t *, size_t, const uint8_t *, size_t,
|
||||
uint64_t, uint8_t *, size_t);
|
||||
|
||||
#endif /* !_SHA256_H_ */
|
140
android/Mailiverse/jni/sysendian.h
Normal file
@ -0,0 +1,140 @@
|
||||
/*-
|
||||
* Copyright 2007-2009 Colin Percival
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
|
||||
*
|
||||
* This file was originally written by Colin Percival as part of the Tarsnap
|
||||
* online backup system.
|
||||
*/
|
||||
#ifndef _SYSENDIAN_H_
|
||||
#define _SYSENDIAN_H_
|
||||
|
||||
#include "scrypt_platform.h"
|
||||
|
||||
/* If we don't have be64enc, the <sys/endian.h> we have isn't usable. */
|
||||
#if !HAVE_DECL_BE64ENC
|
||||
#undef HAVE_SYS_ENDIAN_H
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_ENDIAN_H
|
||||
|
||||
#include <sys/endian.h>
|
||||
|
||||
#else
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
static inline uint32_t
|
||||
be32dec(const void *pp)
|
||||
{
|
||||
const uint8_t *p = (uint8_t const *)pp;
|
||||
|
||||
return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) +
|
||||
((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24));
|
||||
}
|
||||
|
||||
static inline void
|
||||
be32enc(void *pp, uint32_t x)
|
||||
{
|
||||
uint8_t * p = (uint8_t *)pp;
|
||||
|
||||
p[3] = x & 0xff;
|
||||
p[2] = (x >> 8) & 0xff;
|
||||
p[1] = (x >> 16) & 0xff;
|
||||
p[0] = (x >> 24) & 0xff;
|
||||
}
|
||||
|
||||
static inline uint64_t
|
||||
be64dec(const void *pp)
|
||||
{
|
||||
const uint8_t *p = (uint8_t const *)pp;
|
||||
|
||||
return ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +
|
||||
((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +
|
||||
((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +
|
||||
((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));
|
||||
}
|
||||
|
||||
static inline void
|
||||
be64enc(void *pp, uint64_t x)
|
||||
{
|
||||
uint8_t * p = (uint8_t *)pp;
|
||||
|
||||
p[7] = x & 0xff;
|
||||
p[6] = (x >> 8) & 0xff;
|
||||
p[5] = (x >> 16) & 0xff;
|
||||
p[4] = (x >> 24) & 0xff;
|
||||
p[3] = (x >> 32) & 0xff;
|
||||
p[2] = (x >> 40) & 0xff;
|
||||
p[1] = (x >> 48) & 0xff;
|
||||
p[0] = (x >> 56) & 0xff;
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
le32dec(const void *pp)
|
||||
{
|
||||
const uint8_t *p = (uint8_t const *)pp;
|
||||
|
||||
return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) +
|
||||
((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24));
|
||||
}
|
||||
|
||||
static inline void
|
||||
le32enc(void *pp, uint32_t x)
|
||||
{
|
||||
uint8_t * p = (uint8_t *)pp;
|
||||
|
||||
p[0] = x & 0xff;
|
||||
p[1] = (x >> 8) & 0xff;
|
||||
p[2] = (x >> 16) & 0xff;
|
||||
p[3] = (x >> 24) & 0xff;
|
||||
}
|
||||
|
||||
static inline uint64_t
|
||||
le64dec(const void *pp)
|
||||
{
|
||||
const uint8_t *p = (uint8_t const *)pp;
|
||||
|
||||
return ((uint64_t)(p[0]) + ((uint64_t)(p[1]) << 8) +
|
||||
((uint64_t)(p[2]) << 16) + ((uint64_t)(p[3]) << 24) +
|
||||
((uint64_t)(p[4]) << 32) + ((uint64_t)(p[5]) << 40) +
|
||||
((uint64_t)(p[6]) << 48) + ((uint64_t)(p[7]) << 56));
|
||||
}
|
||||
|
||||
static inline void
|
||||
le64enc(void *pp, uint64_t x)
|
||||
{
|
||||
uint8_t * p = (uint8_t *)pp;
|
||||
|
||||
p[0] = x & 0xff;
|
||||
p[1] = (x >> 8) & 0xff;
|
||||
p[2] = (x >> 16) & 0xff;
|
||||
p[3] = (x >> 24) & 0xff;
|
||||
p[4] = (x >> 32) & 0xff;
|
||||
p[5] = (x >> 40) & 0xff;
|
||||
p[6] = (x >> 48) & 0xff;
|
||||
p[7] = (x >> 56) & 0xff;
|
||||
}
|
||||
#endif /* !HAVE_SYS_ENDIAN_H */
|
||||
|
||||
#endif /* !_SYSENDIAN_H_ */
|
3
android/Mailiverse/lint.xml
Normal file
@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<lint>
|
||||
</lint>
|
20
android/Mailiverse/proguard-project.txt
Normal file
@ -0,0 +1,20 @@
|
||||
# To enable ProGuard in your project, edit project.properties
|
||||
# to define the proguard.config property as described in that file.
|
||||
#
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the ProGuard
|
||||
# include property in project.properties.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
16
android/Mailiverse/project.properties
Normal file
@ -0,0 +1,16 @@
|
||||
# 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 edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||
|
||||
# Project target.
|
||||
target=android-17
|
||||
android.library.reference.1=../SlidingMenu/library
|
||||
android.library.reference.2=../Ext
|
9
android/Mailiverse/res/anim/back_enter.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shareInterpolator="false"
|
||||
android:fillBefore="true" android:fillAfter="true"
|
||||
>
|
||||
<translate
|
||||
android:fromXDelta="-100%" android:toXDelta="0%"
|
||||
android:fromYDelta="0%" android:toYDelta="0%"
|
||||
android:duration="300" />
|
||||
</set>
|
10
android/Mailiverse/res/anim/back_leave.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shareInterpolator="false"
|
||||
android:fillBefore="true" android:fillAfter="true"
|
||||
|
||||
>
|
||||
<translate
|
||||
android:fromXDelta="0%" android:toXDelta="100%"
|
||||
android:fromYDelta="0%" android:toYDelta="0%"
|
||||
android:duration="300" />
|
||||
</set>
|
11
android/Mailiverse/res/anim/forward_enter.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shareInterpolator="false"
|
||||
|
||||
android:fillBefore="true" android:fillAfter="true"
|
||||
|
||||
>
|
||||
<translate
|
||||
android:fromXDelta="100%" android:toXDelta="0%"
|
||||
android:fromYDelta="0%" android:toYDelta="0%"
|
||||
android:duration="300" />
|
||||
</set>
|
12
android/Mailiverse/res/anim/forward_leave.xml
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shareInterpolator="false"
|
||||
|
||||
android:fillBefore="true" android:fillAfter="true"
|
||||
|
||||
>
|
||||
<translate android:fromXDelta="0%" android:toXDelta="-100%"
|
||||
android:fromYDelta="0%" android:toYDelta="0%"
|
||||
android:duration="300"/>
|
||||
</set>
|
BIN
android/Mailiverse/res/drawable-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
android/Mailiverse/res/drawable-hdpi/spiral_galaxy_bg.jpg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
android/Mailiverse/res/drawable-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
android/Mailiverse/res/drawable-mdpi/spiral_galaxy_bg.jpg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
android/Mailiverse/res/drawable-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
android/Mailiverse/res/drawable-xhdpi/spiral_galaxy_bg.jpg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
android/Mailiverse/res/drawable-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
android/Mailiverse/res/drawable-xxhdpi/spiral_galaxy_bg.jpg
Normal file
After Width: | Height: | Size: 40 KiB |
28
android/Mailiverse/res/layout/activity_conversation.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/mails"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="40dp"
|
||||
android:background="#000000" >
|
||||
|
||||
<Button
|
||||
android:id="@+id/conversationBackButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Back" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<ListView
|
||||
android:id="@+id/mailList"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ConversationActivity" >
|
||||
</ListView>
|
||||
|
||||
</LinearLayout>
|
87
android/Mailiverse/res/layout/activity_login.xml
Normal file
@ -0,0 +1,87 @@
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context=".LoginActivity" >
|
||||
|
||||
<!-- Login progress -->
|
||||
|
||||
<AbsoluteLayout
|
||||
android:id="@+id/login_background"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#FFFFFF" >
|
||||
</AbsoluteLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/login_status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone" >
|
||||
|
||||
<ProgressBar
|
||||
style="?android:attr/progressBarStyleLarge"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/login_status_message"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:fontFamily="sans-serif-light"
|
||||
android:text="@string/login_progress_signing_in"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Login form -->
|
||||
|
||||
<ScrollView
|
||||
android:id="@+id/login_form"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" >
|
||||
|
||||
<LinearLayout
|
||||
style="@style/LoginFormContainer"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<EditText
|
||||
android:id="@+id/email"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/prompt_email"
|
||||
android:inputType="textEmailAddress"
|
||||
android:maxLines="1"
|
||||
android:singleLine="true"
|
||||
android:textColor="#000000"
|
||||
android:textColorHint="#000000" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/password"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/prompt_password"
|
||||
android:imeActionId="@+id/login"
|
||||
android:imeActionLabel="@string/action_sign_in_short"
|
||||
android:imeOptions="actionUnspecified"
|
||||
android:inputType="textPassword"
|
||||
android:maxLines="1"
|
||||
android:singleLine="true"
|
||||
android:textColor="#000000"
|
||||
android:textColorHint="#000000" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/sign_in_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="right"
|
||||
android:layout_marginTop="16dp"
|
||||
android:paddingLeft="32dp"
|
||||
android:paddingRight="32dp"
|
||||
android:text="@string/action_sign_in_register" />
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
|
||||
</merge>
|
16
android/Mailiverse/res/layout/activity_main.xml
Normal file
@ -0,0 +1,16 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||
android:paddingTop="@dimen/activity_vertical_margin"
|
||||
tools:context=".MainActivity" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/hello_world" />
|
||||
|
||||
</RelativeLayout>
|
81
android/Mailiverse/res/layout/conversation_item.xml
Normal file
@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/LinearLayout2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:focusable="false"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical" >
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/conversationCheck"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:focusable="false" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/RelativeLayout1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/conversationDate"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:textColor="#4444FF" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/conversationName"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignBaseline="@+id/conversationDate"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_toLeftOf="@+id/conversationDate"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/conversationSubject"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:textColor="#333333" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/conversationBrief"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:textColor="#888888" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
27
android/Mailiverse/res/layout/folder.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/LinearLayout1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="36dp"
|
||||
android:background="#000000" >
|
||||
|
||||
<Button
|
||||
android:id="@+id/folderRevealButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Reveal" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<ListView
|
||||
android:id="@+id/conversationList"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" >
|
||||
</ListView>
|
||||
|
||||
</LinearLayout>
|
27
android/Mailiverse/res/layout/folder_item.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/RelativeLayout1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/folderName"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/folderQuantity"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignBaseline="@+id/folderName"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
</RelativeLayout>
|
14
android/Mailiverse/res/layout/mail_header_item.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/mailSubject"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
</LinearLayout>
|
45
android/Mailiverse/res/layout/mail_item.xml
Normal file
@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/RelativeLayout1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/mailAuthor"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/mailDate"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignBaseline="@+id/mailAuthor"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
</RelativeLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/mailRecipients"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Medium Text"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
<TextView android:text="TextView"
|
||||
android:id="@+id/mailBody"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
34
android/Mailiverse/res/layout/reveal_folders.xml
Normal file
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="40dp"
|
||||
android:background="#000000" >
|
||||
|
||||
<Button
|
||||
android:id="@+id/revealLogout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Exit" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/revealUserName"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="User name"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:textColor="#FFFFFF" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<ListView
|
||||
android:id="@+id/folderList"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" >
|
||||
</ListView>
|
||||
|
||||
</LinearLayout>
|
9
android/Mailiverse/res/menu/activity_conversation.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_settings"
|
||||
android:orderInCategory="100"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/menu_settings"/>
|
||||
|
||||
</menu>
|
9
android/Mailiverse/res/menu/activity_folder.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_settings"
|
||||
android:orderInCategory="100"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/menu_settings"/>
|
||||
|
||||
</menu>
|
9
android/Mailiverse/res/menu/activity_main.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_settings"
|
||||
android:orderInCategory="100"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/menu_settings"/>
|
||||
|
||||
</menu>
|
9
android/Mailiverse/res/menu/conversation.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item
|
||||
android:id="@+id/action_settings"
|
||||
android:orderInCategory="100"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/action_settings"/>
|
||||
|
||||
</menu>
|
8
android/Mailiverse/res/menu/login.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item
|
||||
android:id="@+id/action_forgot_password"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/action_forgot_password"/>
|
||||
|
||||
</menu>
|
10
android/Mailiverse/res/values-large/styles.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<resources>
|
||||
|
||||
<style name="LoginFormContainer">
|
||||
<item name="android:layout_width">400dp</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_gravity">center</item>
|
||||
<item name="android:padding">16dp</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
8
android/Mailiverse/res/values-sw600dp/dimens.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Customize dimensions originally defined in res/values/dimens.xml (such as
|
||||
screen margins) for sw600dp devices (e.g. 7" tablets) here.
|
||||
-->
|
||||
|
||||
</resources>
|
9
android/Mailiverse/res/values-sw720dp-land/dimens.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Customize dimensions originally defined in res/values/dimens.xml (such as
|
||||
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
|
||||
-->
|
||||
<dimen name="activity_horizontal_margin">128dp</dimen>
|
||||
|
||||
</resources>
|
11
android/Mailiverse/res/values-v11/styles.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme for API 11+. This theme completely replaces
|
||||
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar">
|
||||
<!-- API 11 theme customizations can go here. -->
|
||||
</style>
|
||||
|
||||
</resources>
|
12
android/Mailiverse/res/values-v14/styles.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme for API 14+. This theme completely replaces
|
||||
AppBaseTheme from BOTH res/values/styles.xml and
|
||||
res/values-v11/styles.xml on API 14+ devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar">
|
||||
<!-- API 14 theme customizations can go here. -->
|
||||
</style>
|
||||
|
||||
</resources>
|
7
android/Mailiverse/res/values/dimens.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<resources>
|
||||
|
||||
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||
|
||||
</resources>
|
12
android/Mailiverse/res/values/strings.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="app_name">Mailiverse</string>
|
||||
<string name="hello_world">Hello world!</string>
|
||||
<string name="menu_settings">Settings</string>
|
||||
<string name="title_activity_folder">FolderActivity</string>
|
||||
<string name="title_activity_main">MainActivity</string>
|
||||
<string name="title_activity_conversation">ConversationActivity</string>
|
||||
<string name="action_settings">Settings</string>
|
||||
|
||||
</resources>
|
17
android/Mailiverse/res/values/strings_activity_login.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<resources>
|
||||
|
||||
<string name="title_activity_login">Sign in</string>
|
||||
|
||||
<!-- Strings related to login -->
|
||||
<string name="prompt_email">Email</string>
|
||||
<string name="prompt_password">Password</string>
|
||||
<string name="action_sign_in_register"><b>Sign in</b> or register</string>
|
||||
<string name="action_sign_in_short">Sign in</string>
|
||||
<string name="action_forgot_password">Recover lost password</string>
|
||||
<string name="login_progress_signing_in">Signing in…</string>
|
||||
<string name="error_invalid_email">This email address is invalid</string>
|
||||
<string name="error_invalid_password">This password is too short</string>
|
||||
<string name="error_incorrect_password">This password is incorrect</string>
|
||||
<string name="error_field_required">This field is required</string>
|
||||
|
||||
</resources>
|
27
android/Mailiverse/res/values/styles.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme, dependent on API level. This theme is replaced
|
||||
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar">
|
||||
<!--
|
||||
Theme customizations available in newer API levels can go in
|
||||
res/values-vXX/styles.xml, while customizations related to
|
||||
backward-compatibility can go here.
|
||||
-->
|
||||
</style>
|
||||
|
||||
<!-- Application theme. -->
|
||||
<style name="AppTheme" parent="AppBaseTheme">
|
||||
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||
</style>
|
||||
|
||||
<style name="LoginFormContainer">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:padding">16dp</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
@ -0,0 +1,41 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
|
||||
import mail.client.Client;
|
||||
import mail.client.model.Conversation;
|
||||
import core.util.Environment;
|
||||
|
||||
public class Application
|
||||
{
|
||||
protected static Application instance = null;
|
||||
|
||||
public static Application getInstance ()
|
||||
{
|
||||
if (instance == null)
|
||||
instance = new Application();
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
protected Application()
|
||||
{
|
||||
System.loadLibrary("Mailiverse");
|
||||
}
|
||||
|
||||
public static class RunState
|
||||
{
|
||||
public String name;
|
||||
public Environment environment;
|
||||
public Client client;
|
||||
|
||||
public Conversation conversation;
|
||||
};
|
||||
|
||||
RunState state = new RunState();
|
||||
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.app.Activity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.Animation.AnimationListener;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.widget.Button;
|
||||
import android.widget.ListView;
|
||||
import android.support.v4.app.NavUtils;
|
||||
|
||||
public class ConversationActivity extends Activity {
|
||||
|
||||
MailListAdapter mailListAdapter;
|
||||
ListView list;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_conversation);
|
||||
|
||||
overridePendingTransition(R.anim.forward_enter, R.anim.forward_leave);
|
||||
|
||||
mailListAdapter = new MailListAdapter(this);
|
||||
mailListAdapter.setConversation(Application.getInstance().state.conversation);
|
||||
|
||||
list = (ListView) findViewById(R.id.mailList);
|
||||
list.setAdapter(mailListAdapter);
|
||||
|
||||
Button backButton = (Button) findViewById(R.id.conversationBackButton);
|
||||
backButton.setOnClickListener(new OnClickListener() {
|
||||
public void onClick(View arg0) {
|
||||
// i need to load the animation, add a listener that sets the view to gone.. or something
|
||||
ConversationActivity.this.finish();
|
||||
overridePendingTransition(R.anim.back_leave,R.anim.back_enter);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.activity_conversation, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
// This ID represents the Home or Up button. In the case of this
|
||||
// activity, the Up button is shown. Use NavUtils to allow users
|
||||
// to navigate up one level in the application structure. For
|
||||
// more details, see the Navigation pattern on Android Design:
|
||||
//
|
||||
// http://developer.android.com/design/patterns/navigation.html#up-vs-back
|
||||
//
|
||||
NavUtils.navigateUpFromSameTask(this);
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,133 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import core.callback.CallbackDefault;
|
||||
import core.util.Arrays;
|
||||
import core.util.Strings;
|
||||
|
||||
import mail.client.Events;
|
||||
import mail.client.model.Conversation;
|
||||
import mail.client.model.Folder;
|
||||
import mail.client.model.FolderSet;
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class ConversationListAdapter extends BaseAdapter
|
||||
{
|
||||
Object NOTLOADED = new Object();
|
||||
|
||||
Context context;
|
||||
FolderSet folder;
|
||||
List<Conversation> buffer;
|
||||
String filter;
|
||||
|
||||
public ConversationListAdapter (Context context)
|
||||
{
|
||||
this.context = context;
|
||||
|
||||
Application.getInstance().state.client.getMaster().getEventPropagator().add(
|
||||
Events.LoadConversation, this,
|
||||
new CallbackDefault () {
|
||||
public void onSuccess(Object... arguments) throws Exception {
|
||||
updateData();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
Application.getInstance().state.client.getMaster().getEventPropagator().add(
|
||||
Events.LoadFolderPart, this,
|
||||
new CallbackDefault () {
|
||||
public void onSuccess(Object... arguments) throws Exception {
|
||||
updateData();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public void updateData ()
|
||||
{
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setFolder(FolderSet folder)
|
||||
{
|
||||
buffer = new ArrayList<Conversation>();
|
||||
this.folder = folder;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount()
|
||||
{
|
||||
if (folder != null)
|
||||
return folder.getNumConversations();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int pos)
|
||||
{
|
||||
if (pos >= buffer.size())
|
||||
buffer.addAll(folder.getConversations(buffer.size(), Math.min(pos+20, getCount()), filter));
|
||||
|
||||
if (pos >= buffer.size())
|
||||
return NOTLOADED;
|
||||
|
||||
return buffer.get(pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int pos)
|
||||
{
|
||||
return pos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasStableIds ()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int pos, View view, ViewGroup parent)
|
||||
{
|
||||
Object item = getItem(pos);
|
||||
if (view == null)
|
||||
{
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
view = inflater.inflate(R.layout.conversation_item, null);
|
||||
}
|
||||
|
||||
TextView name = (TextView) view.findViewById(R.id.conversationName);
|
||||
TextView date = (TextView) view.findViewById(R.id.conversationDate);
|
||||
TextView subject = (TextView) view.findViewById(R.id.conversationSubject);
|
||||
TextView brief = (TextView) view.findViewById(R.id.conversationBrief);
|
||||
|
||||
if (item != NOTLOADED && ((Conversation)item).isLoaded())
|
||||
{
|
||||
Conversation conversation = (Conversation)item;
|
||||
name.setText(conversation.getHeader().getAuthorsShortList());
|
||||
date.setText(conversation.getHeader().getRelativeDate());
|
||||
subject.setText(conversation.getHeader().getSubjectExcludingReplyPrefix());
|
||||
brief.setText(conversation.getHeader().getBrief());
|
||||
}
|
||||
else
|
||||
{
|
||||
name.setText("Loading...");
|
||||
date.setText("");
|
||||
subject.setText("");
|
||||
brief.setText("");
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
|
||||
import mail.client.EventDispatcher;
|
||||
|
||||
public class EventDispatcherAndroid extends EventDispatcher {
|
||||
|
||||
Timer timer;
|
||||
|
||||
public EventDispatcherAndroid ()
|
||||
{
|
||||
setupTimer();
|
||||
}
|
||||
|
||||
public void setupTimer ()
|
||||
{
|
||||
final Handler h = new Handler(new Handler.Callback() {
|
||||
|
||||
@Override
|
||||
public boolean handleMessage(Message msg) {
|
||||
dispatchEvents();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
class Messager extends TimerTask {
|
||||
public void run() {
|
||||
h.sendEmptyMessage(0);
|
||||
}
|
||||
};
|
||||
|
||||
timer = new Timer();
|
||||
timer.schedule(new Messager(), 0, 500);
|
||||
}
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import core.callback.CallbackDefault;
|
||||
|
||||
import mail.client.Events;
|
||||
import mail.client.model.Folder;
|
||||
import mail.client.model.FolderSet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class FolderListAdapter extends BaseAdapter
|
||||
{
|
||||
Application application;
|
||||
Context context;
|
||||
List<Folder> folders = new ArrayList<Folder>();
|
||||
|
||||
public FolderListAdapter (Context context)
|
||||
{
|
||||
application = Application.getInstance();
|
||||
this.context = context;
|
||||
|
||||
application.state.client.getMaster().getEventPropagator().add(
|
||||
Events.LoadFolder, this,
|
||||
new CallbackDefault () {
|
||||
public void onSuccess(Object... arguments) throws Exception {
|
||||
updateData();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public void updateData ()
|
||||
{
|
||||
folders = application.state.client.getMaster().getIndexer().getSystemFolders();
|
||||
FolderListAdapter.this.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount()
|
||||
{
|
||||
return folders.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int pos)
|
||||
{
|
||||
return folders.get(pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int pos)
|
||||
{
|
||||
return pos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasStableIds ()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int pos, View view, ViewGroup parent)
|
||||
{
|
||||
if (view == null)
|
||||
{
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
view = inflater.inflate(R.layout.folder_item, null);
|
||||
}
|
||||
|
||||
TextView name = (TextView) view.findViewById(R.id.folderName);
|
||||
TextView quantity = (TextView) view.findViewById(R.id.folderQuantity);
|
||||
|
||||
FolderSet folder = (FolderSet)folders.get(pos);
|
||||
name.setText(folder.getName());
|
||||
quantity.setText("" + folder.getNumConversations());
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
}
|
82
android/Mailiverse/src/com/benith/mailiverse/FolderView.java
Normal file
@ -0,0 +1,82 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import core.callback.CallbackDefault;
|
||||
import mail.client.Events;
|
||||
import mail.client.model.Conversation;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.Button;
|
||||
import android.widget.ListView;
|
||||
|
||||
public class FolderView extends ViewContainer
|
||||
{
|
||||
ListView list;
|
||||
MainActivity context;
|
||||
ConversationListAdapter conversationListAdapter;
|
||||
|
||||
public FolderView(MainActivity context)
|
||||
{
|
||||
this.context = context;
|
||||
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
view = inflater.inflate(R.layout.folder, null);
|
||||
|
||||
conversationListAdapter = new ConversationListAdapter(view.getContext());
|
||||
list = (ListView) view.findViewById(R.id.conversationList);
|
||||
list.setOnItemClickListener(listener);
|
||||
list.setAdapter(conversationListAdapter);
|
||||
|
||||
Button backButton = (Button) view.findViewById(R.id.folderRevealButton);
|
||||
backButton.setOnClickListener(new OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
FolderView.this.context.getSlidingMenu().showMenu(true);
|
||||
}
|
||||
});
|
||||
|
||||
setupEvents();
|
||||
}
|
||||
|
||||
public void setupEvents ()
|
||||
{
|
||||
Application.getInstance().state.client.getMaster().getEventPropagator().add(
|
||||
Events.Initialized, this, new CallbackDefault() {
|
||||
public void onSuccess(Object... arguments) throws Exception {
|
||||
chooseInitialFolder();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
public void chooseInitialFolder ()
|
||||
{
|
||||
conversationListAdapter.setFolder(
|
||||
Application.getInstance().state.client.getMaster().getIndexer().getInbox()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
public View getView ()
|
||||
{
|
||||
return view;
|
||||
}
|
||||
|
||||
OnItemClickListener listener = new OnItemClickListener() {
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
|
||||
{
|
||||
Application.getInstance().state.conversation =
|
||||
(Conversation)conversationListAdapter.getItem(position);
|
||||
|
||||
Intent intent = new Intent(context, ConversationActivity.class);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
};
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import core.callback.Callback;
|
||||
import core.util.HttpDelegate;
|
||||
import core.util.HttpDelegateJava;
|
||||
|
||||
public class HttpDelegateAndroid extends HttpDelegate
|
||||
{
|
||||
HttpDelegate delegate = new HttpDelegateJava();
|
||||
|
||||
protected class Request
|
||||
{
|
||||
String action;
|
||||
String url;
|
||||
String[][] headers;
|
||||
boolean binaryInput, binaryOutput;
|
||||
byte[] contents;
|
||||
Callback callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String action, String url, String[][] headers,
|
||||
boolean binaryInput, boolean binaryOutput, byte[] contents,
|
||||
Callback callback) {
|
||||
Request request = new Request();
|
||||
request.action = action;
|
||||
request.url = url;
|
||||
request.headers = headers;
|
||||
request.binaryInput = binaryInput;
|
||||
request.binaryOutput = binaryOutput;
|
||||
request.contents = contents;
|
||||
request.callback = callback;
|
||||
|
||||
new AsyncTask<Request, Void, Void>() {
|
||||
protected Void doInBackground(Request... params) {
|
||||
Request r = params[0];
|
||||
|
||||
delegate.execute(r.action, r.url, r.headers, r.binaryInput, r.binaryOutput, r.contents, r.callback);
|
||||
|
||||
return null;
|
||||
}
|
||||
}.execute(request);
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import android.app.ListActivity;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AbsListView;
|
||||
import android.widget.AbsListView.OnScrollListener;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class InfiniteList extends ListActivity implements OnScrollListener
|
||||
{
|
||||
Aleph0 adapter = new Aleph0();
|
||||
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setListAdapter(adapter);
|
||||
getListView().setOnScrollListener(this);
|
||||
}
|
||||
|
||||
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
|
||||
/*
|
||||
boolean loadMore =
|
||||
firstVisible + visibleCount >= totalCount;
|
||||
|
||||
if(loadMore) {
|
||||
adapter.count += visibleCount; // or any other amount
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
public void onScrollStateChanged(AbsListView v, int s)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
class Aleph0 extends BaseAdapter {
|
||||
int count = 40; /* starting amount */
|
||||
|
||||
public int getCount() { return count; }
|
||||
public Object getItem(int pos) { return pos; }
|
||||
public long getItemId(int pos) { return pos; }
|
||||
|
||||
public View getView(int pos, View v, ViewGroup p) {
|
||||
TextView view = new TextView(InfiniteList.this);
|
||||
view.setText("entry " + pos);
|
||||
return view;
|
||||
}
|
||||
}
|
||||
}
|
276
android/Mailiverse/src/com/benith/mailiverse/LoginActivity.java
Normal file
@ -0,0 +1,276 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import core.constants.ConstantsClient;
|
||||
import core.util.Environment;
|
||||
import key.auth.KeyServerAuthenticatorSync;
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.AccelerateInterpolator;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.LinearInterpolator;
|
||||
import android.view.animation.RotateAnimation;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.widget.AbsoluteLayout;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
/**
|
||||
* Activity which displays a login screen to the user, offering registration as
|
||||
* well.
|
||||
*/
|
||||
public class LoginActivity extends Activity
|
||||
{
|
||||
/**
|
||||
* The default email to populate the email field with.
|
||||
*/
|
||||
public static final String EXTRA_NAME = "com.benith.mailiverse.NAME";
|
||||
|
||||
/**
|
||||
* Keep track of the login task to ensure we can cancel it if requested.
|
||||
*/
|
||||
private UserLoginTask mAuthTask = null;
|
||||
|
||||
protected Application application;
|
||||
|
||||
// Values for email and password at the time of the login attempt.
|
||||
private String mName;
|
||||
private String mPassword;
|
||||
|
||||
// UI references.
|
||||
private EditText mNameView;
|
||||
private EditText mPasswordView;
|
||||
private View mLoginFormView;
|
||||
private View mLoginStatusView;
|
||||
private TextView mLoginStatusMessageView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
application = Application.getInstance();
|
||||
setContentView(R.layout.activity_login);
|
||||
|
||||
// Set up the login form.
|
||||
mName = getIntent().getStringExtra(EXTRA_NAME);
|
||||
mNameView = (EditText) findViewById(R.id.email);
|
||||
mNameView.setText(mName);
|
||||
|
||||
mPasswordView = (EditText) findViewById(R.id.password);
|
||||
mPasswordView
|
||||
.setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
||||
@Override
|
||||
public boolean onEditorAction(TextView textView, int id,
|
||||
KeyEvent keyEvent) {
|
||||
if (id == R.id.login || id == EditorInfo.IME_NULL) {
|
||||
attemptLogin();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
mLoginFormView = findViewById(R.id.login_form);
|
||||
mLoginStatusView = findViewById(R.id.login_status);
|
||||
mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
|
||||
|
||||
findViewById(R.id.sign_in_button).setOnClickListener(
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
attemptLogin();
|
||||
}
|
||||
});
|
||||
|
||||
// makeBackgroundRotateForever();
|
||||
}
|
||||
|
||||
public void makeBackgroundRotateForever ()
|
||||
{
|
||||
AbsoluteLayout backgroundContainer = (AbsoluteLayout) findViewById(R.id.login_background);
|
||||
|
||||
ImageView background = new ImageView(this);
|
||||
background.setImageResource(R.drawable.spiral_galaxy_bg);
|
||||
|
||||
WindowManager manager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
|
||||
int width = manager.getDefaultDisplay().getWidth();
|
||||
|
||||
AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(
|
||||
width*2, width*2, 0, 0
|
||||
// backgroundContainer.getWidth() * 2, backgroundContainer.getHeight() * 2
|
||||
);
|
||||
|
||||
backgroundContainer.addView(background, params);
|
||||
|
||||
|
||||
Animation rotateAnim = new RotateAnimation(
|
||||
0, 360,
|
||||
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f
|
||||
);
|
||||
rotateAnim.setDuration(80000);
|
||||
|
||||
rotateAnim.setRepeatCount(Animation.INFINITE);
|
||||
rotateAnim.setInterpolator(new LinearInterpolator());
|
||||
background.startAnimation(rotateAnim);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
super.onCreateOptionsMenu(menu);
|
||||
getMenuInflater().inflate(R.menu.login, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to sign in or register the account specified by the login form.
|
||||
* If there are form errors (invalid email, missing fields, etc.), the
|
||||
* errors are presented and no actual login attempt is made.
|
||||
*/
|
||||
public void attemptLogin() {
|
||||
if (mAuthTask != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Reset errors.
|
||||
mNameView.setError(null);
|
||||
mPasswordView.setError(null);
|
||||
|
||||
// Store values at the time of the login attempt.
|
||||
mName = mNameView.getText().toString();
|
||||
mPassword = mPasswordView.getText().toString();
|
||||
|
||||
boolean cancel = false;
|
||||
View focusView = null;
|
||||
|
||||
// Check for a valid password.
|
||||
if (TextUtils.isEmpty(mPassword)) {
|
||||
mPasswordView.setError(getString(R.string.error_field_required));
|
||||
focusView = mPasswordView;
|
||||
cancel = true;
|
||||
}
|
||||
|
||||
// Check for a valid email address.
|
||||
if (TextUtils.isEmpty(mName)) {
|
||||
mNameView.setError(getString(R.string.error_field_required));
|
||||
focusView = mNameView;
|
||||
cancel = true;
|
||||
}
|
||||
|
||||
if (cancel) {
|
||||
// There was an error; don't attempt login and focus the first
|
||||
// form field with an error.
|
||||
focusView.requestFocus();
|
||||
} else {
|
||||
// Show a progress spinner, and kick off a background task to
|
||||
// perform the user login attempt.
|
||||
mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
|
||||
showProgress(true);
|
||||
mAuthTask = new UserLoginTask();
|
||||
mAuthTask.execute(mName, mPassword);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the progress UI and hides the login form.
|
||||
*/
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
|
||||
private void showProgress(final boolean show) {
|
||||
// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
|
||||
// for very easy animations. If available, use these APIs to fade-in
|
||||
// the progress spinner.
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
|
||||
int shortAnimTime = getResources().getInteger(
|
||||
android.R.integer.config_shortAnimTime);
|
||||
|
||||
mLoginStatusView.setVisibility(View.VISIBLE);
|
||||
mLoginStatusView.animate().setDuration(shortAnimTime)
|
||||
.alpha(show ? 1 : 0)
|
||||
.setListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
mLoginStatusView.setVisibility(show ? View.VISIBLE
|
||||
: View.GONE);
|
||||
}
|
||||
});
|
||||
|
||||
mLoginFormView.setVisibility(View.VISIBLE);
|
||||
mLoginFormView.animate().setDuration(shortAnimTime)
|
||||
.alpha(show ? 0 : 1)
|
||||
.setListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
mLoginFormView.setVisibility(show ? View.GONE
|
||||
: View.VISIBLE);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// The ViewPropertyAnimator APIs are not available, so simply show
|
||||
// and hide the relevant UI components.
|
||||
mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
|
||||
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents an asynchronous login/registration task used to authenticate
|
||||
* the user.
|
||||
*/
|
||||
public class UserLoginTask extends AsyncTask<String, Void, Environment> {
|
||||
@Override
|
||||
protected Environment doInBackground(String... params)
|
||||
{
|
||||
try
|
||||
{
|
||||
String name = params[0];
|
||||
String password = params[1];
|
||||
|
||||
KeyServerAuthenticatorSync auth = new KeyServerAuthenticatorSync();
|
||||
return auth.get(name + ConstantsClient.ATHOST, password, null);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(final Environment success) {
|
||||
mAuthTask = null;
|
||||
showProgress(false);
|
||||
|
||||
if (success != null) {
|
||||
application.state.name = mName;
|
||||
application.state.environment = success;
|
||||
|
||||
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
|
||||
startActivity(intent);
|
||||
|
||||
finish();
|
||||
} else {
|
||||
mPasswordView
|
||||
.setError(getString(R.string.error_incorrect_password));
|
||||
mPasswordView.requestFocus();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCancelled() {
|
||||
mAuthTask = null;
|
||||
showProgress(false);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,162 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import core.callback.CallbackDefault;
|
||||
import mail.client.Events;
|
||||
import mail.client.model.Conversation;
|
||||
import mail.client.model.Mail;
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class MailListAdapter extends BaseAdapter
|
||||
{
|
||||
static final int TYPE_HEADER = 0, TYPE_MAIL = 1;
|
||||
Object HEADER = new Object();
|
||||
|
||||
Conversation conversation;
|
||||
Context context;
|
||||
|
||||
public MailListAdapter (Context context)
|
||||
{
|
||||
this.context = context;
|
||||
|
||||
Application.getInstance().state.client.getMaster().getEventPropagator().add(
|
||||
Events.LoadMail, this,
|
||||
new CallbackDefault () {
|
||||
public void onSuccess(Object... arguments) throws Exception {
|
||||
updateData();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public void updateData()
|
||||
{
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setConversation(Conversation conversation)
|
||||
{
|
||||
this.conversation = conversation;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount()
|
||||
{
|
||||
if (conversation != null)
|
||||
return conversation.getNumItems()+1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (position == 0)
|
||||
return TYPE_HEADER;
|
||||
return TYPE_MAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int pos)
|
||||
{
|
||||
if (pos == 0)
|
||||
return HEADER;
|
||||
|
||||
return conversation.getItems().get(pos-1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int pos)
|
||||
{
|
||||
return pos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasStableIds ()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int pos, View view, ViewGroup parent)
|
||||
{
|
||||
if (view == null)
|
||||
{
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
|
||||
switch (getItemViewType(pos))
|
||||
{
|
||||
|
||||
case TYPE_HEADER:
|
||||
view = inflater.inflate(R.layout.mail_header_item, null);
|
||||
break;
|
||||
|
||||
case TYPE_MAIL:
|
||||
view = inflater.inflate(R.layout.mail_item, null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (getItemViewType(pos))
|
||||
{
|
||||
case TYPE_HEADER:
|
||||
TextView subject = (TextView)view.findViewById(R.id.mailSubject);
|
||||
subject.setText(conversation.getHeader().getSubject());
|
||||
break;
|
||||
|
||||
case TYPE_MAIL:
|
||||
Mail mail = (Mail)getItem(pos);
|
||||
TextView author = (TextView)view.findViewById(R.id.mailAuthor);
|
||||
TextView date = (TextView)view.findViewById(R.id.mailDate);
|
||||
TextView recipients = (TextView)view.findViewById(R.id.mailRecipients);
|
||||
TextView body = (TextView)view.findViewById(R.id.mailBody);
|
||||
|
||||
if (mail.isLoaded())
|
||||
{
|
||||
author.setText("" + mail.getHeader().getAuthor());
|
||||
date.setText(mail.getHeader().getRelativeDate());
|
||||
recipients.setText(mail.getHeader().getRecipients().shortList());
|
||||
|
||||
String html, mimeType;
|
||||
if (mail.getBody().hasHTML())
|
||||
{
|
||||
mimeType = "text/html";
|
||||
html = mail.getBody().getStrippedHTML();
|
||||
}
|
||||
else
|
||||
if (mail.getBody().hasText())
|
||||
{
|
||||
mimeType = "text/plain";
|
||||
html = mail.getBody().getStrippedText();
|
||||
}
|
||||
else
|
||||
{
|
||||
mimeType = "text/plain";
|
||||
html = "";
|
||||
}
|
||||
|
||||
String encoding = "utf-8";
|
||||
body.setText(html);
|
||||
// body.loadData(html, mimeType, encoding);
|
||||
}
|
||||
else
|
||||
{
|
||||
author.setText("Loading...");
|
||||
date.setText("");
|
||||
recipients.setText("");
|
||||
body.setText("");
|
||||
// body.clearView();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.benith.mailiverse;
|
||||
|
||||
import com.slidingmenu.lib.SlidingMenu;
|
||||
import com.slidingmenu.lib.app.SlidingActivity;
|
||||
|
||||
import core.util.HttpDelegateJava;
|
||||
import core.util.LogOut;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import mail.client.Client;
|
||||
import mail.client.EventDispatcher;
|
||||
|
||||
public class MainActivity extends SlidingActivity {
|
||||
|
||||
static LogOut log = new LogOut(MainActivity.class);
|
||||
|
||||
RevealFoldersView revealFoldersView;
|
||||
FolderView folderView;
|
||||
|
||||
public Client client;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Application application = Application.getInstance();
|
||||
|
||||
try
|
||||
{
|
||||
application.state.client = Client.start(
|
||||
application.state.environment,
|
||||
application.state.name,
|
||||
new HttpDelegateAndroid(),
|
||||
new EventDispatcherAndroid()
|
||||
);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
log.exception(e);
|
||||
}
|
||||
|
||||
folderView = new FolderView(this);
|
||||
revealFoldersView = new RevealFoldersView(this);
|
||||
setContentView(folderView.getView());
|
||||
setBehindContentView(revealFoldersView.getView());
|
||||
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.activity_main, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|