diff --git a/Android/.gitignore b/Android/.gitignore
new file mode 100644
index 0000000..39fb081
--- /dev/null
+++ b/Android/.gitignore
@@ -0,0 +1,9 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/Android/.idea/compiler.xml b/Android/.idea/compiler.xml
new file mode 100644
index 0000000..96cc43e
--- /dev/null
+++ b/Android/.idea/compiler.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/.idea/copyright/profiles_settings.xml b/Android/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..e7bedf3
--- /dev/null
+++ b/Android/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/Android/.idea/encodings.xml b/Android/.idea/encodings.xml
new file mode 100644
index 0000000..97626ba
--- /dev/null
+++ b/Android/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/.idea/gradle.xml b/Android/.idea/gradle.xml
new file mode 100644
index 0000000..7ac24c7
--- /dev/null
+++ b/Android/.idea/gradle.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/.idea/misc.xml b/Android/.idea/misc.xml
new file mode 100644
index 0000000..3be1ace
--- /dev/null
+++ b/Android/.idea/misc.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/.idea/modules.xml b/Android/.idea/modules.xml
new file mode 100644
index 0000000..aaad7e9
--- /dev/null
+++ b/Android/.idea/modules.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/.idea/runConfigurations.xml b/Android/.idea/runConfigurations.xml
new file mode 100644
index 0000000..7f68460
--- /dev/null
+++ b/Android/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/.idea/vcs.xml b/Android/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/Android/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/README.md b/Android/README.md
new file mode 100644
index 0000000..0d2b212
--- /dev/null
+++ b/Android/README.md
@@ -0,0 +1,25 @@
+## Android版本的项目框架
+
+### 说明
+* 运行模式
+
+> * ListView展示所有项目,点击选择进入对应的项目界面
+
+> * 只需按照下面的步骤操作,即可自动完成耦合
+
+
+![](http://images2015.cnblogs.com/blog/951171/201609/951171-20160924003428121-1127574073.png)
+
+* 增加项目的方法
+* step 1:去values -> string -> Project,在Project中添加名称
+* step 2:新建一个独立的package,在该package里新建Activity用来展示功能,并设置隐式启动的action,同时在actionDocument类中添加对应的信息
+* step 3:在Activity中实现自己的项目功能
+
+### 实现了的功能展示
+* 逆转字符串
+
+![](http://images2015.cnblogs.com/blog/951171/201609/951171-20160924003440481-342957189.png)
+
+* 加密短信
+
+![](http://images2015.cnblogs.com/blog/951171/201609/951171-20160924003435496-1603527109.png)
diff --git a/Android/app/.gitignore b/Android/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/Android/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/Android/app/build.gradle b/Android/app/build.gradle
new file mode 100644
index 0000000..1e0090d
--- /dev/null
+++ b/Android/app/build.gradle
@@ -0,0 +1,25 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 24
+ buildToolsVersion "24.0.0"
+ defaultConfig {
+ applicationId "andrew.com.android_ver"
+ minSdkVersion 17
+ targetSdkVersion 24
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile 'com.android.support:appcompat-v7:24.2.1'
+ testCompile 'junit:junit:4.12'
+}
diff --git a/Android/app/proguard-rules.pro b/Android/app/proguard-rules.pro
new file mode 100644
index 0000000..dd9245d
--- /dev/null
+++ b/Android/app/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Users\Andrew\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# 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 *;
+#}
diff --git a/Android/app/src/androidTest/java/andrew/com/android_ver/ExampleInstrumentedTest.java b/Android/app/src/androidTest/java/andrew/com/android_ver/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..a3a1e56
--- /dev/null
+++ b/Android/app/src/androidTest/java/andrew/com/android_ver/ExampleInstrumentedTest.java
@@ -0,0 +1,27 @@
+package andrew.com.android_ver;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.*;
+
+/**
+ * Instrumentation test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("andrew.com.android_ver", appContext.getPackageName());
+ }
+}
diff --git a/Android/app/src/main/AndroidManifest.xml b/Android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b6b8dd3
--- /dev/null
+++ b/Android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/app/src/main/java/andrew/com/android_ver/ListViewAdapter.java b/Android/app/src/main/java/andrew/com/android_ver/ListViewAdapter.java
new file mode 100644
index 0000000..1a4f728
--- /dev/null
+++ b/Android/app/src/main/java/andrew/com/android_ver/ListViewAdapter.java
@@ -0,0 +1,87 @@
+package andrew.com.android_ver;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.ListAdapter;
+
+import static andrew.com.android_ver.actionDocument.project_activity;
+
+/**
+ * Created by Andrew on 2016/9/22.
+ */
+
+public class ListViewAdapter extends BaseAdapter implements ListAdapter {
+
+ private Context context;
+ private Activity activity;
+ private int attr;
+ private String[] data;
+
+ public ListViewAdapter(Activity context, int attr, String[] data) {
+ this.context = context;
+ this.activity = context;
+ this.attr = attr;
+ this.data = data;
+ }
+
+ @Override
+ public int getCount() {
+ return data.length;
+ }
+
+ @Override
+ public Object getItem(int i) {
+ return null;
+ }
+
+ @Override
+ public long getItemId(int i) {
+ return i;
+ }
+
+ @Override
+ public View getView(int i, View view, ViewGroup viewGroup) {
+ final Button button;
+ if (view == null) {
+ LayoutInflater inflater = LayoutInflater.from(context);
+ view = inflater.inflate(attr, null);
+ button = (Button) view.findViewById(R.id.btn_Show);
+
+ view.setTag(new ViewHolder(button));
+ } else {
+ ViewHolder holder = (ViewHolder) view.getTag();
+ button = holder.getButton();
+ }
+
+ button.setText(data[i]);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ CharSequence activity = button.getText();
+ Intent i = new Intent();
+ String action = project_activity.get(activity);
+ i.setAction(action);
+ context.startActivity(i);
+ }
+ });
+ return view;
+ }
+
+ private class ViewHolder {
+ Button button;
+
+ public ViewHolder(Button button) {
+ this.button = button;
+ }
+
+ public Button getButton() {
+ return button;
+ }
+ }
+}
diff --git a/Android/app/src/main/java/andrew/com/android_ver/ProjectListView.java b/Android/app/src/main/java/andrew/com/android_ver/ProjectListView.java
new file mode 100644
index 0000000..6e3cc98
--- /dev/null
+++ b/Android/app/src/main/java/andrew/com/android_ver/ProjectListView.java
@@ -0,0 +1,35 @@
+package andrew.com.android_ver;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.ListView;
+
+import static andrew.com.android_ver.R.layout.item;
+
+public class ProjectListView extends AppCompatActivity {
+
+ private ListView project_Document_ListView;
+ private String[] project_Document;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_project_list_view);
+
+ //增加项目内容的方法:
+ //step 1:去values -> string -> Project,在Project中添加内容
+ //step 2:新建一个独立的package,建立显示的Activity,设置启动的action,并在actionDocument类中添加对应的信息
+ //step 3:实现自己的项目内容
+
+
+ //在string文件中获取存在的项目内容
+ project_Document = this.getResources().getStringArray(R.array.Project);
+
+ //用来展示项目的ListView
+ project_Document_ListView = (ListView) findViewById(R.id.project_Document_ListView);
+ project_Document_ListView.setAdapter(new ListViewAdapter(this,item,project_Document));
+
+ }
+
+
+}
diff --git a/Android/app/src/main/java/andrew/com/android_ver/SecretMessage/SecretMessageView.java b/Android/app/src/main/java/andrew/com/android_ver/SecretMessage/SecretMessageView.java
new file mode 100644
index 0000000..d31ea4c
--- /dev/null
+++ b/Android/app/src/main/java/andrew/com/android_ver/SecretMessage/SecretMessageView.java
@@ -0,0 +1,81 @@
+package andrew.com.android_ver.SecretMessage;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import andrew.com.android_ver.R;
+
+public class SecretMessageView extends AppCompatActivity implements View.OnClickListener {
+
+ private EditText et_Input;
+ private TextView tv_compile;
+ private TextView tv_parsing;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_secret_message_view);
+
+ et_Input = (EditText) findViewById(R.id.et_Input);
+ tv_compile = (TextView) findViewById(R.id.tv_compile);
+ tv_parsing = (TextView) findViewById(R.id.tv_parsing);
+
+ findViewById(R.id.btn_Compile).setOnClickListener(this);
+ findViewById(R.id.btn_parsing).setOnClickListener(this);
+
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.btn_Compile:
+ String content = null;
+ try{
+ content = et_Input.getText().toString();
+
+ //更换这里调用的加密方法即可改变加密的方式
+ //假如你在某一个瞬间,看着这里,突然就杀气喷涌,抑制不住了,
+ String res = compiledByidiot(content);
+
+ if (res != null) {
+ tv_compile.setText("加密后的内容为:" + res.toString());
+ } else {
+ Toast.makeText(getApplicationContext(), "加密出错", Toast.LENGTH_SHORT).show();
+ }
+ } catch (NullPointerException e){
+ Toast.makeText(getApplicationContext(), "请先输入要加密的内容", Toast.LENGTH_SHORT).show();
+ }
+ break;
+ case R.id.btn_parsing:
+ String parsingRes = et_Input.getText().toString();
+ tv_parsing.setText("对加密内容解密为:" + parsingRes);
+ break;
+ }
+ }
+
+ private String compiledByidiot(String content) {
+ char[] document = {'!','@','#','$','%','^','&','*','-','+',};
+ int count = content.length();
+ StringBuilder res = new StringBuilder();
+ byte[] ch = null;
+ int value = -1;
+ while (count > 0) {
+ if (ch == null && value == -1){
+ ch = content.substring(count-1,count).getBytes();
+ value = Math.abs(ch[0]%10);
+ res.append(document[value]);
+ count--;
+ }
+ ch = null;
+ value = -1;
+ }
+ return res.toString();
+ }
+
+
+}
diff --git a/Android/app/src/main/java/andrew/com/android_ver/TurnDownString/MainActivity.java b/Android/app/src/main/java/andrew/com/android_ver/TurnDownString/MainActivity.java
new file mode 100644
index 0000000..c62a5e6
--- /dev/null
+++ b/Android/app/src/main/java/andrew/com/android_ver/TurnDownString/MainActivity.java
@@ -0,0 +1,47 @@
+package andrew.com.android_ver.TurnDownString;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import andrew.com.android_ver.R;
+
+public class MainActivity extends AppCompatActivity {
+
+ private EditText et_input;
+ private TextView tv_Result;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ et_input = (EditText) findViewById(R.id.et_input);
+ tv_Result = (TextView) findViewById(R.id.tv_Result);
+
+ findViewById(R.id.btn_Turn).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ String before = et_input.getText().toString();
+ String after = TurnDown(before);
+
+ tv_Result.setText("颠倒顺序前为:"+before+"\n颠倒顺序后,结果为:"+after);
+ }
+ });
+
+ }
+
+ private String TurnDown(String before) {
+ StringBuilder res = new StringBuilder();
+ int count = before.length();
+ while (count > 0){
+ String change = before.substring(count-1,count);
+ res.append(change);
+ change = null;
+ count--;
+ }
+ return res.toString();
+ }
+}
diff --git a/Android/app/src/main/java/andrew/com/android_ver/actionDocument.java b/Android/app/src/main/java/andrew/com/android_ver/actionDocument.java
new file mode 100644
index 0000000..e990d1e
--- /dev/null
+++ b/Android/app/src/main/java/andrew/com/android_ver/actionDocument.java
@@ -0,0 +1,28 @@
+package andrew.com.android_ver;
+
+import java.util.HashMap;
+
+/**
+ * Created by Andrew on 2016/9/23.
+ */
+
+public class actionDocument {
+
+ //用来储存Activity对应的Action
+ public static HashMap project_activity;
+
+ public actionDocument() {
+ this.project_activity = new HashMap<>();
+ init();
+ }
+
+
+ private void init() {
+ //尝试通过string资源来存储信息,但是无法通过中文直接引用,只好使用hashmap
+ //这里是存储的对应项目的Activity的隐式启动action
+ project_activity.put("逆转字符串","Action_TurnDownString");
+ project_activity.put("密码短信","Action_SecretMessage");
+ }
+
+
+}
diff --git a/Android/app/src/main/java/andrew/com/android_ver/application.java b/Android/app/src/main/java/andrew/com/android_ver/application.java
new file mode 100644
index 0000000..97803e4
--- /dev/null
+++ b/Android/app/src/main/java/andrew/com/android_ver/application.java
@@ -0,0 +1,23 @@
+package andrew.com.android_ver;
+
+import android.app.Application;
+
+/**
+ * Created by Andrew on 2016/9/23.
+ */
+
+public class application extends Application {
+
+ private actionDocument actionDocument;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ //加载项目的ACTION信息
+ actionDocument = new actionDocument();
+ }
+
+
+
+}
diff --git a/Android/app/src/main/res/layout/activity_main.xml b/Android/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..47fda36
--- /dev/null
+++ b/Android/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
diff --git a/Android/app/src/main/res/layout/activity_project_list_view.xml b/Android/app/src/main/res/layout/activity_project_list_view.xml
new file mode 100644
index 0000000..671f1bb
--- /dev/null
+++ b/Android/app/src/main/res/layout/activity_project_list_view.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/Android/app/src/main/res/layout/activity_secret_message_view.xml b/Android/app/src/main/res/layout/activity_secret_message_view.xml
new file mode 100644
index 0000000..7b9b348
--- /dev/null
+++ b/Android/app/src/main/res/layout/activity_secret_message_view.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Android/app/src/main/res/layout/item.xml b/Android/app/src/main/res/layout/item.xml
new file mode 100644
index 0000000..85527c7
--- /dev/null
+++ b/Android/app/src/main/res/layout/item.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/Android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/Android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/Android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/Android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/Android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/Android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/Android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
Binary files /dev/null and b/Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/Android/app/src/main/res/values-w820dp/dimens.xml b/Android/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/Android/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/Android/app/src/main/res/values/colors.xml b/Android/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..3ab3e9c
--- /dev/null
+++ b/Android/app/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/Android/app/src/main/res/values/dimens.xml b/Android/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/Android/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/Android/app/src/main/res/values/strings.xml b/Android/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..6dc6f2b
--- /dev/null
+++ b/Android/app/src/main/res/values/strings.xml
@@ -0,0 +1,11 @@
+
+ Android_Ver
+
+
+
+ - 逆转字符串
+ - 密码短信
+
+
+
+
diff --git a/Android/app/src/main/res/values/styles.xml b/Android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..5885930
--- /dev/null
+++ b/Android/app/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/Android/app/src/test/java/andrew/com/android_ver/ExampleUnitTest.java b/Android/app/src/test/java/andrew/com/android_ver/ExampleUnitTest.java
new file mode 100644
index 0000000..a7e47bb
--- /dev/null
+++ b/Android/app/src/test/java/andrew/com/android_ver/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package andrew.com.android_ver;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/Android/build.gradle b/Android/build.gradle
new file mode 100644
index 0000000..a3330d4
--- /dev/null
+++ b/Android/build.gradle
@@ -0,0 +1,23 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:2.2.0'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/Android/gradle.properties b/Android/gradle.properties
new file mode 100644
index 0000000..aac7c9b
--- /dev/null
+++ b/Android/gradle.properties
@@ -0,0 +1,17 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/Android/gradle/wrapper/gradle-wrapper.jar b/Android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null and b/Android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/Android/gradle/wrapper/gradle-wrapper.properties b/Android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..04e285f
--- /dev/null
+++ b/Android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Dec 28 10:00:20 PST 2015
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/Android/gradlew b/Android/gradlew
new file mode 100644
index 0000000..9d82f78
--- /dev/null
+++ b/Android/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/Android/gradlew.bat b/Android/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/Android/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/Android/settings.gradle b/Android/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/Android/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/README.md b/README.md
index f452a21..6b50c51 100644
--- a/README.md
+++ b/README.md
@@ -73,8 +73,8 @@
* 基于文本的游戏——做一个像Utopia那样的文本RPG,游戏中,你可以创建一个文明、收集资源、共铸联盟、施放法术、回合制系统。看看是否能够统一王国。
* 定时自动登录——做一个程序可以在预定的时间登录进某个指定的网页并且执行特定的动作,然后在登出。可以用来检查邮箱、发布常规内容、为其它程序获取信息。
* 电子卡片生成器——可以让用户制作自己的电子卡片并发送给其他人。可以使用flash也可以不用。可以使用图片库,也可以加上深刻的格言警句。
-* 内容管理系统——像Joomala、Drupal、PHP Nuke这样的内容管理系统。从简单的做起,慢慢增加其它功能。
-* 模板制作器——该网站应用允许用户输入各种颜色代码、元素、尺寸,来为PHPBB、Invision Board、MySpace之类的应用创建模板文件。
+* 内容管理系统——像Joomala、Drupal、PHP Nuke这样的内容管理系统。从简单的做起,慢慢增加其它功能。
+* 模板制作器——该网站应用允许用户输入各种颜色代码、元素、尺寸,来为PHPBB、Invision Board、MySpace之类的应用创建模板文件。
* 验证码生成器——应该在登录时见过有数字有字母的验证码图片吧?这可以防止自动登录和垃圾广告。试着自己做一个,如果使用PHP的话,看下GD的图片函数。
### 文件
@@ -87,7 +87,7 @@
* Zip文件生成器——用户输入不同文件夹的文件,也许还包括其他电脑中的文件,然后程序将这些文件打包成zip文件。复杂一点的话,打包时对这些文件进行压缩。
* PDF生成器——从txt、html或其它文件中读取数据生成PDF文件。可以做成一个网页服务,用户上传文件,返回一个pdf版本。
* 批量文件命名器——程序批量处理一些文件,将根据用户提供的过滤器为它们重命名。譬如用户输入的过滤器为myimage###.jpg,那么会生成至少包含3位数的文件名,譬如myimage001.jpg、myimage145.jpg,甚至是myimage1987.jpg,因为1987也满足了至少包含3位数的条件。
-* MP3标签生成器——修改MP3文件的id3v1标签。还可以试着在MP3文件的头部加入id3v2的标签,譬如album art标签。
+* MP3标签生成器——修改MP3文件的id3v1标签。还可以试着在MP3文件的头部加入id3v2的标签,譬如album art标签。
* 日志文件生成器——该程序可以记录指定事件的日志。譬如程序做了什么、系统在干什么、文件什么时候被修改了。
* Excel分页输出器——做一个在线程序,可以读取文件内容生成一个excel分页。可以通过CVS或者其它文件格式来做。复杂一点的话看看是否能创建公式字段。
* RPG角色属性生成器——做一个程序来给RPG角色随机分配属性点数,可以由用户制定一些分配规则。可以生成职业、性别、力量/魔法/敏捷点数、额外能力或者贸易技能。把结果保存成文件,这样跑团的时候地下城主可以把它打印出来。
@@ -106,7 +106,7 @@
* 电视节目记录器——你是否有不想错过的电视节目?但没有录像机或者想之后能找到该电视节目然后录下来,那么可以做个程序寻找各种在线电视导航网站,记录下电视节目名称、播放时间、播放频道,存在数据库中。数据库或者网站到时就会发邮件提醒你,节目就快在某个频道开始了。
* 旅行计划系统——该系统可以让用户管理旅行路线,记录下航班和酒店安排、感兴趣的地方、预算和时间表。
* 实体关系图生成器——该程序可以让用户整合实体关系图,并将其保存起来,也可以用它来生成一些基础SQL语句。
-* 数据库翻译器(MySQL<->SQL Server)——该工具可以从数据库A读取数据,生成数据库B使用的SQL语句,将数据存入数据库B。比较常用的是SQL Server和Oracle使用的MySQL服务器。
+* 数据库翻译器(MySQL<->SQL Server)——该工具可以从数据库A读取数据,生成数据库B使用的SQL语句,将数据存入数据库B。比较常用的是SQL Server和Oracle使用的MySQL服务器。
* BBS论坛——为你和小伙伴们做一个论坛,可以发帖、管理、分享想法和构思。
### 图像和多媒体