Repository: Hankkin/TaoSchool
Branch: master
Commit: d52c81de284a
Files: 131
Total size: 444.7 KB
Directory structure:
gitextract__kczv6ja/
├── .gitignore
├── .idea/
│ ├── compiler.xml
│ ├── copyright/
│ │ └── profiles_settings.xml
│ ├── encodings.xml
│ ├── gradle.xml
│ ├── misc.xml
│ ├── modules.xml
│ ├── runConfigurations.xml
│ └── vcs.xml
├── README.md
├── app/
│ ├── .gitignore
│ ├── app.iml
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── hankkin/
│ │ └── compustrading/
│ │ └── ApplicationTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── hankkin/
│ │ │ └── compustrading/
│ │ │ ├── Application/
│ │ │ │ └── MyApplication.java
│ │ │ ├── MainActivity.java
│ │ │ ├── User/
│ │ │ │ └── UserBean.java
│ │ │ ├── Utils/
│ │ │ │ ├── BitmapUtils.java
│ │ │ │ └── HankkinUtils.java
│ │ │ ├── activity/
│ │ │ │ ├── BaseActivity.java
│ │ │ │ ├── LoginActivity.java
│ │ │ │ ├── MainShowActivity.java
│ │ │ │ ├── NewProductActivity.java
│ │ │ │ ├── PersonActivity.java
│ │ │ │ ├── ProdectDetailActivity.java
│ │ │ │ ├── RegisterActivity.java
│ │ │ │ ├── SearchProActivity.java
│ │ │ │ └── SplasActivity.java
│ │ │ ├── adapter/
│ │ │ │ ├── CategoryFragmentAdapter.java
│ │ │ │ ├── PersonInfoAdapter.java
│ │ │ │ └── ProductAdapter.java
│ │ │ ├── fragment/
│ │ │ │ └── CateDetailFragment.java
│ │ │ ├── interface/
│ │ │ │ ├── FileUploadListener.java
│ │ │ │ └── ScrollDirectionListener.java
│ │ │ ├── model/
│ │ │ │ ├── Category.java
│ │ │ │ ├── Person.java
│ │ │ │ ├── PersonShow.java
│ │ │ │ └── Product.java
│ │ │ ├── sharepreference/
│ │ │ │ └── MySP.java
│ │ │ ├── slidingmenu/
│ │ │ │ ├── CustomViewAbove.java
│ │ │ │ ├── CustomViewBehind.java
│ │ │ │ ├── SlidingActivityBase.java
│ │ │ │ ├── SlidingActivityHelper.java
│ │ │ │ ├── SlidingMenu.java
│ │ │ │ └── SlidingPreferenceActivity.java
│ │ │ └── view/
│ │ │ ├── CollapsingAvatarToolbar.java
│ │ │ ├── PagerSlidingTabStrip.java
│ │ │ ├── RippleView.java
│ │ │ ├── RoundedImageView.java
│ │ │ ├── floatbutton/
│ │ │ │ ├── AbsListViewScrollDetector.java
│ │ │ │ ├── AddFloatingActionButton.java
│ │ │ │ ├── FloatingActionButton.java
│ │ │ │ ├── FloatingActionsMenu.java
│ │ │ │ ├── FloatingActionsMenuHidable.java
│ │ │ │ └── TouchDelegateGroup.java
│ │ │ ├── ipulltozoom/
│ │ │ │ ├── IPullToZoom.java
│ │ │ │ ├── PullToZoomBase.java
│ │ │ │ └── PullToZoomScrollViewEx.java
│ │ │ └── refreshload/
│ │ │ ├── MetaballView.java
│ │ │ └── RefreshLayout.java
│ │ └── res/
│ │ ├── anim/
│ │ │ ├── anim.xml
│ │ │ └── list_anim.xml
│ │ ├── drawable/
│ │ │ ├── bmob_update_button_cancel_bg_focused.xml
│ │ │ ├── bmob_update_button_cancel_bg_normal.xml
│ │ │ ├── bmob_update_button_cancel_bg_selector.xml
│ │ │ ├── bmob_update_button_cancel_bg_tap.xml
│ │ │ ├── bmob_update_button_check_selector.xml
│ │ │ ├── bmob_update_button_close_bg_selector.xml
│ │ │ ├── bmob_update_button_ok_bg_focused.xml
│ │ │ ├── bmob_update_button_ok_bg_normal.xml
│ │ │ ├── bmob_update_button_ok_bg_selector.xml
│ │ │ ├── bmob_update_button_ok_bg_tap.xml
│ │ │ ├── bmob_update_dialog_bg.xml
│ │ │ ├── btn_login_background.xml
│ │ │ ├── fab_label_background.xml
│ │ │ ├── login_et_background.xml
│ │ │ ├── normal_white_bg.xml
│ │ │ ├── shadow.xml
│ │ │ └── tab_background.xml
│ │ ├── layout/
│ │ │ ├── activity_login.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_main_show.xml
│ │ │ ├── activity_new_product.xml
│ │ │ ├── activity_person.xml
│ │ │ ├── activity_prodect_detail.xml
│ │ │ ├── activity_product_detail.xml
│ │ │ ├── activity_register.xml
│ │ │ ├── activity_search_pro.xml
│ │ │ ├── activity_splas.xml
│ │ │ ├── bmob_update_dialog.xml
│ │ │ ├── fragment_item.xml
│ │ │ ├── listview_footer.xml
│ │ │ ├── listview_personinfo.xml
│ │ │ ├── loading.xml
│ │ │ ├── lv_product_item.xml
│ │ │ ├── profile_contect_view.xml
│ │ │ ├── profile_head_view.xml
│ │ │ ├── profile_zoom_view.xml
│ │ │ ├── slidingmenumain.xml
│ │ │ └── view_select_img.xml
│ │ ├── menu/
│ │ │ ├── menu_login.xml
│ │ │ ├── menu_main.xml
│ │ │ ├── menu_new_product.xml
│ │ │ ├── menu_person.xml
│ │ │ ├── menu_prodect_detail.xml
│ │ │ ├── menu_register.xml
│ │ │ ├── menu_search.xml
│ │ │ └── menu_splas.xml
│ │ ├── values/
│ │ │ ├── arrays.xml
│ │ │ ├── attrs.xml
│ │ │ ├── bmob_common_strings.xml
│ │ │ ├── bmob_update_string.xml
│ │ │ ├── color.xml
│ │ │ ├── dimens.xml
│ │ │ ├── ids.xml
│ │ │ ├── strings.xml
│ │ │ ├── styles.xml
│ │ │ └── texsize.xml
│ │ └── values-w820dp/
│ │ └── dimens.xml
│ └── test/
│ └── java/
│ └── com/
│ └── hankkin/
│ └── compustrading/
│ └── ExampleUnitTest.java
├── app-release.apk
├── build.gradle
├── compaus.jks
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
================================================
FILE: .idea/compiler.xml
================================================
================================================
FILE: .idea/copyright/profiles_settings.xml
================================================
================================================
FILE: .idea/encodings.xml
================================================
================================================
FILE: .idea/gradle.xml
================================================
================================================
FILE: .idea/misc.xml
================================================
================================================
FILE: .idea/modules.xml
================================================
================================================
FILE: .idea/runConfigurations.xml
================================================
================================================
FILE: .idea/vcs.xml
================================================
================================================
FILE: README.md
================================================
**该APP已经不再维护了,如果您需要的话 请看 https://github.com/Hankkin/Reading**
*Reading是一款基于WanAndroid OpenApi开发的阅读类工具,如果你是一个热衷于Android开发者,那么这款软件能帮助你阅读精品Android文章。 同时Reading中还包含"英文单词"、"账号本子"、"天气"、"查单词"、"快递查询"等小工具。项目基于"Kotlin+MVP"架构开发,风格大概也许属于Material Desgin原质化风格,包含主题颜色切换、百变Logo、 等功能。在此感谢WanAndroid的OpenApi,以及其它开源项目的贡献。
*
# TaoSchool
一款基于Material Desgin设计的APP
###look at the screenshot:
###download:
网站:
http://hankkin.bmob.cn
PRE:
http://pre.im/x9nH
360开发者平台:
http://zhushou.360.cn/detail/index/soft_id/3181637?recrefer=SE_D_%E6%B7%98School
百度开发平台
http://shouji.baidu.com/soft/item?docid=8561791&from=&f=search_app_淘School%40list_1_title%401%40header_all_input
###tech:
1.Android Support Desgin
CollapsingAvatarToolbar 头像随ListView滚动缩回到ActionBar特效
TextInputLayout带动画的输入框
2.ActionBarDrawerToggle、DrawerLayout、ActionBar 结合
3.RippleEffect水波纹效果
4.PagerSlidingTabStrip+viewpager实现选项卡左右滑动
5.FloatActiconButton悬浮按钮实现仿钉钉悬浮按钮
6.PullToZoomScrollView实现下拉自动放大头部View
7.materialdialog实现的对话框
8.MaterialSpinner实现的带效果的spinner
9.butterknife注解框架
CSDN博客地址:http://blog.csdn.net/lyhhj/article/details/50413625
微信:huang1019283569
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/app.iml
================================================
generateDebugSources
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.hankkin.compustrading"
minSdkVersion 14
targetSdkVersion 22
versionCode 3
versionName "1.1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'cn.bmob.android:bmob-sdk:3.5.5'
compile 'cn.bmob.android:http-legacy:1.0'
compile 'com.android.support:support-v4:25.2.0'
compile 'com.github.manuelpeinado.fadingactionbar:fadingactionbar-abc:3.1.2'
compile 'com.pnikosis:materialish-progress:1.7'
compile 'me.drakeet.materialdialog:library:1.2.8'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.weiwangcn.betterspinner:library:1.1.0'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.android.support:design:25.2.0'
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/Hankkin/Library/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 *;
#}
-optimizationpasses 5 # 指定代码的压缩级别
-dontusemixedcaseclassnames # 是否使用大小写混合
-dontpreverify # 混淆时是否做预校验
-verbose # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法
-keep public class * extends android.app.Activity # 保持哪些类不被混淆
-keep public class * extends android.app.Application # 保持哪些类不被混淆
-keep public class * extends android.app.Service # 保持哪些类不被混淆
-keep public class * extends android.content.BroadcastReceiver # 保持哪些类不被混淆
-keep public class * extends android.content.ContentProvider # 保持哪些类不被混淆
-keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些类不被混淆
-keep public class * extends android.preference.Preference # 保持哪些类不被混淆
-keep public class com.android.vending.licensing.ILicensingService # 保持哪些类不被混淆
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native ;
}
-keepclasseswithmembers class * { # 保持自定义控件类不被混淆
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {# 保持自定义控件类不被混淆
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆
public void *(android.view.View);
}
-keepclassmembers enum * { # 保持枚举 enum 类不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
public static final android.os.Parcelable$Creator *;
}
================================================
FILE: app/src/androidTest/java/com/hankkin/compustrading/ApplicationTest.java
================================================
package com.hankkin.compustrading;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* Testing Fundamentals
*/
public class ApplicationTest extends ApplicationTestCase {
public ApplicationTest() {
super(Application.class);
}
}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
================================================
FILE: app/src/main/java/com/hankkin/compustrading/Application/MyApplication.java
================================================
package com.hankkin.compustrading.Application;
import android.app.Application;
import android.graphics.Bitmap;
import android.os.Environment;
import android.os.Handler;
import com.hankkin.compustrading.R;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import java.io.File;
import cn.bmob.v3.Bmob;
/**
* Created by Hankkin on 15/11/28.
*/
public class MyApplication extends Application {
private static String DB_PATH = null;
private MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
//初始化Bmob Key
Bmob.initialize(this,"b493c51d9d5c205dde89e4f4dedc10cd");
initImageloader();
}
/**
* 初始化imageloader
* by Hankkin at:2015-12-23 19:29:57
*/
public void initImageloader(){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_download)
.showImageOnFail(R.drawable.ic_download)
.resetViewBeforeLoading(false) // default
.delayBeforeLoading(0)
.cacheInMemory(true) // default
.cacheOnDisk(true) // default
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
.build();
// This configuration tuning is custom. You can tune every option, you may tune some of them,
// or you can create default configuration by
// ImageLoaderConfiguration.createDefault(this);
// method.
// File cacheDir = StorageUtils.getCacheDirectory(context);
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/compustrading");
if (!file.exists()) {
file.mkdir();
}
String path = file.getAbsolutePath() + "/files";
File fileSD = new File(path);
if (!fileSD.exists()) {
fileSD.mkdir();
}
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiskCache(file)) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(1000)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(getApplicationContext())) // default
.imageDecoder(new BaseImageDecoder(true)) // default
.defaultDisplayImageOptions(options) // default
.writeDebugLogs()
.build();
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config);
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/MainActivity.java
================================================
package com.hankkin.compustrading;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.hankkin.compustrading.activity.MainShowActivity;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.btn_login)
Button btnLogin;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
ButterKnife.bind(this);
// Product product = new Product(0,"九成新Iphone6",4000,"")
}
@OnClick(R.id.btn_login)
public void btnLoginClick() {
Intent intent = new Intent(MainActivity.this, MainShowActivity.class);
startActivity(intent);
finish();
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/User/UserBean.java
================================================
package com.hankkin.myapplication.User;
import cn.bmob.v3.BmobObject;
/**
* Created by Hankkin on 15/11/28.
*/
public class UserBean extends BmobObject {
private String name;
private String tel;
private String icon_url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getIcon_url() {
return icon_url;
}
public void setIcon_url(String icon_url) {
this.icon_url = icon_url;
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/Utils/BitmapUtils.java
================================================
package com.hankkin.compustrading.Utils;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Environment;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Created by Hankkin on 15/12/24.
*/
public class BitmapUtils {
public static Bitmap getCompressedBitmap(Activity act, String filepath) {
Bitmap tempBitmap = null;
float width = act.getResources().getDisplayMetrics().widthPixels;
float height = act.getResources().getDisplayMetrics().heightPixels;
try {
if (width > 640) {
tempBitmap = getSuitableBitmap(act, Uri.fromFile(new java.io.File(filepath)), 640, (640 / width) * height);
} else {
tempBitmap = getSuitableBitmap(act, Uri.fromFile(new java.io.File(filepath)), (int) width, (int) height);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return tempBitmap;
}
/**
* 说明:请调用getSuitableBitmap()方法并传入图像路径,返回Bitmap
*
* 修改宽高压缩比例
* by:Hankkin at:2015-2-14
*/
public static Bitmap getSuitableBitmap(Activity act, Uri uri, float ww, float hh)
throws FileNotFoundException {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = true;//只读边,不读内容
Bitmap bitmap = null;
bitmap = BitmapFactory.decodeStream(act.getContentResolver().openInputStream(uri), null, newOpts);
newOpts.inJustDecodeBounds = false;
float w = newOpts.outWidth;
float h = newOpts.outHeight;
float wwh = 640f;//
float hhh = (wwh / w) * h;//
int be = 1;
if (w > h && w > wwh) {
be = (int) (newOpts.outWidth / wwh);
} else if (w < h && h > hhh) {
be = (int) (newOpts.outHeight / hhh);
be += 1;
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;//设置采样率
newOpts.inPreferredConfig = Bitmap.Config.ARGB_8888;//该模式是默认的,可不设
newOpts.inPurgeable = true;// 同时设置才会有效
newOpts.inInputShareable = true;//。当系统内存不够时候图片自动被回收
bitmap = BitmapFactory.decodeStream(act.getContentResolver().openInputStream(uri), null, newOpts);
// return compressBmpFromBmp(bitmap);//原来的方法调用了这个方法企图进行二次压缩
//其实是无效的,大家尽管尝试
return bitmap;
}
/**
* 质量压缩
* by:Hankkin at:2015-2-14
*
* @param image
* @return
*/
public static ByteArrayOutputStream compressImage(Bitmap image) {
int options = 100;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
while (baos.size() / 1024 > 30 && options > 40) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();
options -= 10;//每次都减少10
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
}
return baos;
}
/**
* bitmap临时转为文件等待上传
* by Hankkin at:2015-4-24
*
* @param bitmap
* @param path
* @return
*/
public static String saveBitmap(Bitmap bitmap, String path) {
String filePath = null;
String updatePath = Environment.getExternalStorageDirectory().getPath() + "/compustrading/tempUploadPic";
File fileSD = new File(updatePath);
if (!fileSD.exists()) {
fileSD.mkdir();
}
try {
filePath = updatePath + "/" + path;
FileOutputStream out = new FileOutputStream(filePath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 30, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return filePath.trim();
}
/**
* 读取照片exif信息中的旋转角度
*
* @param path 照片路径
* @return角度
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/**
* 旋转照片
* by Hankkin at:2015年10月8日 11:17:04
* @param img
* @return
*/
public static Bitmap toturn(Bitmap img){
Matrix matrix = new Matrix();
matrix.postRotate(+90); /*翻转90度*/
int width = img.getWidth();
int height =img.getHeight();
img = Bitmap.createBitmap(img, 0, 0, width, height, matrix, true);
return img;
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/Utils/HankkinUtils.java
================================================
/**
* YUtils.java[V1.0.0]
* classes : com.wadiankeji.creditsmanager.util.YUtils
*
* @author Hankkin Create at 2014年11月27日 下午7:48:31
*/
package com.hankkin.compustrading.Utils;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.*;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Rect;
import android.media.ExifInterface;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* by 李斐 at 2014年11月27日 下午7:48:31
* 增加getPath相关方法
* by:李斐 at:2015-06-18 10:51:16
*/
public class HankkinUtils {
private static final String TAG = "YUtils";
// 记录屏幕的高度、宽度、密度等信息。
public static int screenH;
public static int screenW;
public static float screenDensity; // 屏幕密度(0.75 / 1.0 / 1.5)
public static int screenDensityDpi; // 屏幕密度DPI(120 / 160 / 240)
public static int statusBarHeight; // 状态栏高度
@SuppressLint("SimpleDateFormat")
public static String longtimeToDate(long time) {
Date now = new Date(time * 1000);
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");// 可以方便地修改日期格式
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String dateStr = dateFormat.format(now);
return dateStr;
}
/**
* 修改时间戳转化时间
* by黄海杰 at:2015年7月27日 15:44:16
*
* @param time
* @return
*/
@SuppressLint("SimpleDateFormat")
public static String longtimeToDayDate(long time) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd HH:mm");// 可以方便地修改日期格式
String dateStr = dateFormat.format(new Date(time));
return dateStr;
}
public static String getCurrentTime(String format) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault());
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String currentTime = sdf.format(date);
return currentTime;
}
@SuppressLint("SimpleDateFormat")
public static String longtimeToDateYMD(long time) {
Date now = new Date(time);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 可以方便地修改日期格式
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String dateStr = dateFormat.format(now);
return dateStr;
}
/**
* 根据yyyy-MM-dd HH:mm:ss格式时间字符串转为long型时间戳
*
* @param dateStr
* @return date long
* by:Hankkin at:2015年6月25日 17:38:25 修改时区设置
*/
public static long stringDateToLong(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
Date date = null;
try {
date = sdf.parse(dateStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date.getTime();
}
public static String getCurrentTime() {
return getCurrentTime("yyyy-MM-dd HH:mm:ss");
}
/**
* 将时间戳转为代表"距现在多久之前"的字符串
* 修改为向下取整
* by黄海杰 at:2015年7月1日 17:08:55
*
* @param dateTime 时间戳
* @return
*/
public static String getStandardDate(long dateTime) {
StringBuffer sb = new StringBuffer();
// long t = Long.parseLong(timeStr);
// long time = System.currentTimeMillis() - (t*1000);
long time = System.currentTimeMillis() - (dateTime);
long mill = (long) Math.floor(time / 1000);//秒前
long minute = (long) Math.floor(time / 60 / 1000.0f);// 分钟前
long hour = (long) Math.floor(time / 60 / 60 / 1000.0f);// 小时
long day = (long) Math.floor(time / 24 / 60 / 60 / 1000.0f);// 天前
if (day - 1 > 0) {
sb.append(day + "天");
} else if (hour - 1 > 0) {
if (hour >= 24) {
sb.append("1天");
} else {
sb.append(hour + "小时");
}
} else if (minute - 1 > 0) {
if (minute == 60) {
sb.append("1小时");
} else {
sb.append(minute + "分钟");
}
} else if (mill - 1 > 0) {
if (mill == 60) {
sb.append("1分钟");
} else {
sb.append(mill + "秒");
}
} else {
sb.append("刚刚");
}
if (!sb.toString().equals("刚刚")) {
sb.append("前");
}
return sb.toString();
}
/**
* 根据时间戳的差获取时间差
* by黄海杰 at:2015年7月13日 11:24:25
* 修改超过一天的显示时间
* by黄海杰 at:2015年7月27日 15:44:32
*
* @param dateTime
* @return
*/
public static String getDateAgo(long dateTime) {
String days = null;
// long t = Long.parseLong(timeStr);
// long time = System.currentTimeMillis() - (t*1000);
long timeInterval = (System.currentTimeMillis() - (dateTime)) / 1000;
if (timeInterval < 60) {
days = "1分钟前";
} else if (timeInterval < 3600) {
days = "" + (int) Math.round(timeInterval / 60) + "分钟内";
} else if (timeInterval < 86400) {
if (timeInterval % 3600 > 1800) {
days = "" + (int) Math.round((timeInterval / 3600) + 1) + "小时内";
} else {
days = "" + (int) Math.round((timeInterval / 3600)) + "小时内";
}
}
// else if (timeInterval<2592000){
// days = ""+(int)Math.floor(timeInterval/86400)+"天前";
// }
// else if (timeInterval<31536000){
// days = ""+(int)Math.floor(timeInterval/2592000)+"个月前";
// }
// else {
// days = ""+(int)Math.floor(timeInterval/31536000)+"年前";
// }
else {
days = longtimeToDayDate(dateTime);
}
return days;
}
/**
* 升级检测
*
* @param locVersionName
* @param lastVersion
* @return 是否升级
*/
public static boolean checkUpdate(String locVersionName, String lastVersion) {
boolean hasUpdate = false;
String[] locVersionS = locVersionName.split("\\.");
String[] lastVersionS = lastVersion.split("\\.");
if (!locVersionName.equals(lastVersion)) {
if (locVersionS != null && lastVersion != null) {
int localLenth = locVersionS.length;
int lastVerLenth = lastVersionS.length;
// int netLenth = lastVersion.length();
for (int i = 0; i < lastVerLenth; i++) {
if (localLenth < lastVerLenth && i == localLenth) {
hasUpdate = true;
return hasUpdate;
}
if (Integer.valueOf(lastVersionS[i]) > Integer
.valueOf(locVersionS[i])) {
hasUpdate = true;
return hasUpdate;
} else if (Integer.valueOf(lastVersionS[i]) < Integer
.valueOf(locVersionS[i])) {
hasUpdate = false;
return hasUpdate;
}
}
}
} else {
hasUpdate = false;
}
return hasUpdate;
}
/**
* bitmap转byte数组
*
* @param bmp
* @param needRecycle
* @return
*/
public static byte[] bmpToByteArray(final Bitmap bmp,
final boolean needRecycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bmp.compress(CompressFormat.PNG, 100, output);
if (needRecycle) {
bmp.recycle();
}
byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 实现文本复制功能 add by lif
*
* @param content
*/
public static void copy(String content, Context context) {
// 得到剪贴板管理器
ClipboardManager cmb = (ClipboardManager) context
.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(content.trim());
HankkinUtils.showToast(context, "内容已复制");
}
/**
* 实现粘贴功能 add by lif
*
* @param context
* @return
*/
public static String paste(Context context) {
// 得到剪贴板管理器
ClipboardManager cmb = (ClipboardManager) context
.getSystemService(Context.CLIPBOARD_SERVICE);
return cmb.getText().toString().trim();
}
/**
* 隐藏软键盘
*/
public static void hideSoftInputMethod(Activity act) {
View view = act.getWindow().peekDecorView();
if (view != null) {
// 隐藏虚拟键盘
InputMethodManager inputmanger = (InputMethodManager) act
.getSystemService(act.INPUT_METHOD_SERVICE);
inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
/**
* 切换软件盘 显示隐藏
*/
public static void switchSoftInputMethod(Activity act) {
// 方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示)
InputMethodManager iMM = (InputMethodManager) act
.getSystemService(Context.INPUT_METHOD_SERVICE);
iMM.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
/**
* 验证是否手机号码
*
* @param mobiles
* @return
*/
public static boolean isMobileNO(String mobiles) {
String telRegex = "[1][358]\\d{9}";//"[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。
if (TextUtils.isEmpty(mobiles)) return false;
else return mobiles.matches(telRegex);
}
/**
* 中文识别
*/
public static boolean hasChinese(String source) {
String reg_charset = "([\\u4E00-\\u9FA5]*+)";
Pattern p = Pattern.compile(reg_charset);
Matcher m = p.matcher(source);
boolean hasChinese = false;
while (m.find()) {
if (!"".equals(m.group(1))) {
hasChinese = true;
}
}
return hasChinese;
}
/**
* 用户名规则判断
*
* @param uname
* @return
*/
public static boolean isAccountStandard(String uname) {
Pattern p = Pattern.compile("[A-Za-z0-9_]+");
Matcher m = p.matcher(uname);
return m.matches();
}
// java 合并两个byte数组
public static byte[] byteMerger(byte[] byte_1, byte[] byte_2) {
byte[] byte_3 = new byte[byte_1.length + byte_2.length];
System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
return byte_3;
}
/**
* 删除文件夹下所有文件
* Hankkin at:2015年4月21日 20:05:01
*
* @param file
*/
public static void delete(File file) {
if (file.isFile()) {
file.delete();
return;
}
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
if (childFiles == null || childFiles.length == 0) {
file.delete();
return;
}
for (int i = 0; i < childFiles.length; i++) {
delete(childFiles[i]);
}
// file.delete();
}
}
/**
* 取得系统版本号
* by: Hankkin at: 2015-04-13
*
* @param context
* @return version 当前项目版本号
*/
public static String GetVersion(Context context) {
try {
PackageInfo manager = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
return manager.versionName;
} catch (PackageManager.NameNotFoundException e) {
return "Unknown";
}
}
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri
.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri
.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri
.getAuthority());
}
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri
.getAuthority());
}
// public static String getDateAgo(int timeline){
// long curTimeline = System.currentTimeMillis();
// int timeInterval = timeline - curTimeline;
// if (timeInterval<60){
// return "1分钟内";
// }
// else if (timeInterval<3600){
// return ""+Math.floor(timeInterval/60)+"分钟前";
// }
// else if (timeInterval<86400){
// return ""+Math.floor(timeInterval/3600)+"小时前";
// }
// else if (timeInterval<2592000){
// return ""+Math.floor(timeInterval/86400)+"天前";
// }
// else if (timeInterval<31536000){
// return ""+Math.floor(timeInterval/2592000)+"个月前";
// }
// else {
// return ""+Math.floor(timeInterval/31536000)+"年前";
// }
// }
/**
* 创建视频临时帧图片
* by Hankkin at:2015年8月18日 11:21:03
*
* @param filePath
* @return
*/
public static Bitmap getVideoThumbnail(String filePath) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(filePath);
bitmap = retriever.getFrameAtTime();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
try {
retriever.release();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
return bitmap;
}
public static boolean isDebug = true;// 是否需要打印bug,可以在application的onCreate函数里面初始化
/**
* 记录上次点击时间
*/
private static long lastClickTime;
/**
* 是否快速双击点击
*
* @return isFastDoubleClick
*/
public static boolean isFastDoubleClick() {
long time = System.currentTimeMillis();
if (time - lastClickTime < 600) {
return true;
} else {
lastClickTime = time;
return false;
}
}
/*-----------------------toast start-----------------------*/
/**
* 提示字符串
* short Toast
*
* @param context
* @param text
*/
public static void showToast(Context context, String text) {
Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
/**
* 提示字符串
* short Toast
*
* @param context
* @param text
*/
public static void showLToast(Context context, String text) {
Toast toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
/**
* 提示根据ResId关联字符串
* short Toast
* by:Hankkin at:2015年4月30日 14:39:41
*
* @param context
* @param resId
*/
public static void showToast(Context context, int resId) {
Toast toast = Toast.makeText(context, resId, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
/**
* 提示根据ResId关联字符串
* 时常long Toast
* by:Hankkin at:2015年4月30日 14:39:41
*
* @param context
* @param resId
*/
public static void showLToast(Context context, int resId) {
Toast toast = Toast.makeText(context, resId, Toast.LENGTH_LONG);
;
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
/*-----------------------toast end-----------------------*/
/*获得屏幕相关的辅助类*/
/*-----------------------screen start-----------------------*/
/**
* 获得屏幕高度
*
* @param context
* @return
*/
public static int getScreenWidth(Context context) {
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.widthPixels;
}
/**
* 获得屏幕宽度
*
* @param context
* @return
*/
public static int getScreenHeight(Context context) {
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.heightPixels;
}
/**
* 获取屏幕密度
*
* @param context
* @return
*/
public static float getScreenDensity(Context context) {
return context.getResources().getDisplayMetrics().density;
}
/**
* dip转px像素
*
* @param context
* @param px
* @return
*/
public static int dip2px(Context context, float px) {
final float scale = getScreenDensity(context);
return (int) (px * scale + 0.5);
}
/**
* 获得状态栏的高度
*
* @param context
* @return
*/
public static int getStatusHeight(Context context) {
int statusHeight = -1;
try {
Class> clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height")
.get(object).toString());
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
return statusHeight;
}
/**
* 获取当前屏幕截图,包含状态栏
*
* @param activity
* @return
*/
public static Bitmap snapShotWithStatusBar(Activity activity) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
int width = getScreenWidth(activity);
int height = getScreenHeight(activity);
Bitmap bp = null;
bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
view.destroyDrawingCache();
return bp;
}
/**
* 获取当前屏幕截图,不包含状态栏
*
* @param activity
* @return
*/
public static Bitmap snapShotWithoutStatusBar(Activity activity) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
int width = getScreenWidth(activity);
int height = getScreenHeight(activity);
Bitmap bp = null;
bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height
- statusBarHeight);
view.destroyDrawingCache();
return bp;
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 读取照片exif信息中的旋转角度
*
* @param path 照片路径
* @return角度
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/*-----------------------screen end-----------------------*/
/*日志打印*/
/*-----------------------log start-----------------------*/
// 下面四个是默认tag的函数
public static void i(String msg) {
if (isDebug)
Log.i(TAG, msg);
}
public static void d(String msg) {
if (isDebug)
Log.d(TAG, msg);
}
public static void e(String msg) {
if (isDebug)
Log.e(TAG, msg);
}
public static void v(String msg) {
if (isDebug)
Log.v(TAG, msg);
}
// 下面是传入自定义tag的函数
public static void i(String tag, String msg) {
if (isDebug)
Log.i(tag, msg);
}
public static void d(String tag, String msg) {
if (isDebug)
Log.i(tag, msg);
}
public static void e(String tag, String msg) {
if (isDebug)
Log.i(tag, msg);
}
public static void v(String tag, String msg) {
if (isDebug)
Log.i(tag, msg);
}
/*-----------------------log end-----------------------*/
/**
* 字符串转MD5
* by黄海杰 at:2015-10-29 16:15:32
*
* @param string
* @return
*/
public static String md5(String string) {
byte[] hash;
try {
hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Huh, MD5 should be supported?", e);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Huh, UTF-8 should be supported?", e);
}
StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 0xFF) < 0x10) hex.append("0");
hex.append(Integer.toHexString(b & 0xFF));
}
return hex.toString();
}
/**
* 获取手机号
* by Hankkin
* @param context
* @return
*/
public static String getPhoneNumber(Context context){
TelephonyManager mTelephonyMgr;
mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return mTelephonyMgr.getLine1Number();
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/activity/BaseActivity.java
================================================
package com.hankkin.compustrading.activity;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.PersistableBundle;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import com.hankkin.compustrading.FileUploadListener;
import com.hankkin.compustrading.R;
import com.hankkin.compustrading.Utils.HankkinUtils;
import com.hankkin.compustrading.model.Person;
import com.pnikosis.materialishprogress.ProgressWheel;
import java.io.File;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.UploadFileListener;
import me.drakeet.materialdialog.MaterialDialog;
/**
* Created by Hankkin on 15/12/20.
*/
public class BaseActivity extends AppCompatActivity {
/*请求相机Code*/
public static final int REQUST_CODE_CAMERA = 0;
/*请求相册Code*/
public static final int REQUEST_CODE_GALLERY = 1;
/*发布商品Code*/
public static final int REQUEST_CODE_FABU = 2;
public MaterialDialog loadDialog;
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
public Person getCurrentPerson(Context context){
Person person = Person.getCurrentUser(Person.class);
return person;
}
/**
* 调用相册
* by Hankkin at:2015-12-20 23:00:16
* @param act
*/
public void getImageFromGallery(Activity act) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
act.startActivityForResult(intent, REQUEST_CODE_GALLERY);
}
/**
* 上传图片
* by Hankkin at:2015-12-20 23:00:34
*/
public void uploadImg(final String filepath, Context context, final FileUploadListener listener){
final BmobFile file = new BmobFile(new File(filepath));
file.upload(new UploadFileListener() {
@Override
public void done(BmobException e) {
if (e == null){
listener.success(file.getFileUrl());
}
else {
listener.fail();
}
}
});
}
public void showLoadingDialog(){
loadDialog = new MaterialDialog(this);
View view = LayoutInflater.from(this).inflate(R.layout.loading,null,false);
ProgressWheel wheel = (ProgressWheel) view.findViewById(R.id.pw_loading);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(80,80);
params.height = HankkinUtils.dip2px(this,80);
params.width = HankkinUtils.dip2px(this,80);
wheel.setLayoutParams(params);
wheel.setBackgroundColor(getResources().getColor(R.color.light_white));
loadDialog.setView(view);
loadDialog.setBackgroundResource(getResources().getColor(R.color.transparent));
loadDialog.show();
}
public void dimissDialog(){
if (loadDialog!=null){
loadDialog.dismiss();
}
}
/**
* 初始化图片路径
*
* @return
*/
public static String iniFilePath(Activity act) {
String filepath = null;
String path = null;
File fileSD = null;
// 准备存储位置
boolean sdExist = Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED);
if (!sdExist) {
HankkinUtils.showLToast(act, "没有找到SD存储卡");
return null;
} else {
//TODO 内容提示完善
path = Environment.getExternalStorageDirectory().getPath() + "/compustrading/Camera";
fileSD = new File(path);
if (fileSD.exists()) {
filepath = path + "/" + System.currentTimeMillis() + ".jpg";
} else {
fileSD.mkdir();
filepath = fileSD.getAbsolutePath() + "/" + System.currentTimeMillis() + ".jpg";
}
return filepath;
}
}
/**
* 调用相机
*
* @param act
*/
public static void goCamera(Activity act, String filepath) {
File file = new File(filepath);
// 启动Camera
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
act.startActivityForResult(intent, REQUST_CODE_CAMERA);
}
/**
* 从URI获取本地路径
*
* @param selectedVideoUri
* @param contentResolver
* @return
*/
public static String getAbsoluteImagePath(Activity activity, Uri contentUri) {
//如果是对媒体文件,在android开机的时候回去扫描,然后把路径添加到数据库中。
//由打印的contentUri可以看到:2种结构。正常的是:content://那么这种就要去数据库读取path。
//另外一种是Uri是 file:///那么这种是 Uri.fromFile(File file);得到的
System.out.println(contentUri);
String[] projection = { MediaStore.Images.Media.DATA };
String urlpath;
CursorLoader loader = new CursorLoader(activity,contentUri, projection, null, null, null);
Cursor cursor = loader.loadInBackground();
try
{
int column_index = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
urlpath =cursor.getString(column_index);
//如果是正常的查询到数据库。然后返回结构
return urlpath;
}
catch (Exception e)
{
e.printStackTrace();
// TODO: handle exception
}finally{
if(cursor != null){
cursor.close();
}
}
//如果是文件。Uri.fromFile(File file)生成的uri。那么下面这个方法可以得到结果
urlpath = contentUri.getPath();
return urlpath;
}
/**
* android系统版本选择图库图片解决方法---获取图片路径
* by Hankkin at:2015-3-10
*
* @param context
* @param uri
* @return
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/"
+ split[1];
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = MediaStore.MediaColumns._ID + "=?";
final String[] selectionArgs = new String[]{split[1]};
return getDataColumn(context, contentUri, selection,
selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* android系统版本选择图库图片解决方法--获取数据
* by Hankkin at:2015-3-10
*
* @param context
* @param uri
* @param selection
* @param selectionArgs
* @return
*/
public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = MediaStore.MediaColumns.DATA;
final String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection,
selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri
.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri
.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri
.getAuthority());
}
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri
.getAuthority());
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/activity/LoginActivity.java
================================================
package com.hankkin.compustrading.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.hankkin.compustrading.R;
import com.hankkin.compustrading.Utils.HankkinUtils;
import com.hankkin.compustrading.model.Person;
import com.hankkin.compustrading.sharepreference.MySP;
import com.pnikosis.materialishprogress.ProgressWheel;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.LogInListener;
public class LoginActivity extends AppCompatActivity {
@Bind(R.id.btn_login)
Button btnLogin;
@Bind(R.id.tv_back)
TextView tvBack;
@Bind(R.id.tv_register)
TextView tvRegister;
@Bind(R.id.et_login_name)
EditText etName;
@Bind(R.id.et_login_pwd)
EditText etPwd;
@Bind(R.id.pw_loading)
ProgressWheel wheel;
public static LoginActivity instance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
initViews();
}
private void initViews() {
wheel.stopSpinning();
}
@OnClick(R.id.tv_register)
public void register() {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
}
@OnClick(R.id.tv_back)
public void back() {
finish();
}
@OnClick(R.id.btn_login)
public void login() {
wheel.spin();
final String name = etName.getText().toString().trim();
final String pwd = etPwd.getText().toString().trim();
if (TextUtils.isEmpty(name)) {
HankkinUtils.showToast(LoginActivity.this, "用户名不能为空");
return;
}
if (TextUtils.isEmpty(pwd)) {
HankkinUtils.showToast(LoginActivity.this, "密码不能为空");
return;
}
Person.loginByAccount(name, pwd, new LogInListener() {
@Override
public void done(Person person, BmobException e) {
MySP.setPASSWoRD(LoginActivity.this, pwd);
MySP.setUSERNAME(LoginActivity.this, name);
wheel.stopSpinning();
HankkinUtils.showToast(LoginActivity.this, "登录成功");
Intent intent = new Intent(LoginActivity.this, MainShowActivity.class);
startActivity(intent);
finish();
if (LoginActivity.instance != null) {
LoginActivity.instance.finish();
}
if (PersonActivity.instance != null) {
PersonActivity.instance.finish();
}
if (MainShowActivity.instance!=null){
MainShowActivity.instance.finish();
}
}
});
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/activity/MainShowActivity.java
================================================
package com.hankkin.compustrading.activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.hankkin.compustrading.R;
import com.hankkin.compustrading.Utils.HankkinUtils;
import com.hankkin.compustrading.adapter.CategoryFragmentAdapter;
import com.hankkin.compustrading.fragment.CateDetailFragment;
import com.hankkin.compustrading.model.Category;
import com.hankkin.compustrading.model.Person;
import com.hankkin.compustrading.model.Product;
import com.hankkin.compustrading.view.PagerSlidingTabStrip;
import com.hankkin.compustrading.view.RippleView;
import com.hankkin.compustrading.view.RoundedImageView;
import com.hankkin.compustrading.view.floatbutton.FloatingActionButton;
import com.hankkin.compustrading.view.floatbutton.FloatingActionsMenu;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.update.BmobUpdateAgent;
public class MainShowActivity extends BaseActivity {
/**
* 分类滑动选项卡
*/
private PagerSlidingTabStrip pagerTab;
/**
* 滑动组件
*/
private ViewPager pager;
/**
* 选项fragment界面
*/
private ArrayList fragments;
/**
* 分类数组
*/
private ArrayList categories = new ArrayList<>();
/**
* 分类界面适配器
*/
private CategoryFragmentAdapter adapter;
DrawerLayout drawerLayout;
ActionBarDrawerToggle drawerToggle;
@Bind(R.id.rv_usericon)
RoundedImageView rvUser;
@Bind(R.id.tv_person)
TextView tvPerson;
@Bind(R.id.rv_logreg)
RippleView rvLogReg;
@Bind(R.id.tv_username)
TextView tvName;
@Bind(R.id.rv_buy)
RippleView rvBuy;
@Bind(R.id.rv_sale)
RippleView rvSale;
@Bind(R.id.rv_sina)
RippleView rvSina;
@Bind(R.id.rv_qq)
RippleView rvQQ;
@Bind(R.id.tv_qq)
TextView tvQQ;
@Bind(R.id.tv_sina)
TextView tvSina;
@Bind(R.id.tv_buy)
TextView tvBuy;
@Bind(R.id.tv_sale)
TextView tvSale;
@Bind(R.id.tv_show)
TextView tvShow;
private Handler handler;
private Person person;
@Bind(R.id.multiple_actions)
FloatingActionsMenu floatingActionsMenu;
public static MainShowActivity instance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
setContentView(R.layout.activity_main_show);
BmobUpdateAgent.update(this);
ButterKnife.bind(this);
init();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {
for (int i = 0; i < categories.size(); i++) {
CateDetailFragment fragment = new CateDetailFragment();
fragment.setFab(floatingActionsMenu);
Bundle bundle = new Bundle();
bundle.putInt("cid", categories.get(i).getId());
bundle.putSerializable("products", (Serializable) msg.obj);
fragment.setArguments(bundle);
fragments.add(fragment);
}
adapter = new CategoryFragmentAdapter(getSupportFragmentManager(), fragments, categories);
pager.setAdapter(adapter);
pagerTab.setViewPager(pager);
dimissDialog();
}
}
};
}
/**
* 初始化数据
* by Hankkin at:2015-11-29 19:29:52
*/
private void init() {
drawerLayout = (DrawerLayout) findViewById(R.id.drawerlayout);
drawerToggle = new ActionBarDrawerToggle(MainShowActivity.this, drawerLayout, R.string.hello_world, R.string.hello_world);
drawerLayout.setDrawerListener(drawerToggle);
//设定左上角突变可点击
getSupportActionBar().setHomeButtonEnabled(true);
// 给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//设置标题
getSupportActionBar().setTitle(getResources().getString(R.string.action_title));
pager = (ViewPager) findViewById(R.id.pager);
pagerTab = (PagerSlidingTabStrip) findViewById(R.id.tab);
pager.setOffscreenPageLimit(4);
fragments = new ArrayList<>();
/**
* 更新按钮点击事件
* by Hankkin at:2015-12-23 17:29:52
*/
FloatingActionButton fbUpdate = (FloatingActionButton) findViewById(R.id.fb_update);
fbUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragments.get(pager.getCurrentItem()).hideFab();
fragments.get(pager.getCurrentItem()).updatePeo();
}
});
/**
* 新建按钮点击事件
* by Hankkin at:2015-12-23 17:30:17
*/
FloatingActionButton fbWrite = (FloatingActionButton) findViewById(R.id.fb_new);
fbWrite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Person person = BmobUser.getCurrentUser(Person.class);
if (person != null) {
fragments.get(pager.getCurrentItem()).hideFab();
Intent intent = new Intent(MainShowActivity.this, NewProductActivity.class);
startActivity(intent);
} else {
fragments.get(pager.getCurrentItem()).hideFab();
Intent intent = new Intent(MainShowActivity.this, LoginActivity.class);
startActivity(intent);
HankkinUtils.showToast(MainShowActivity.this, "请先登录");
}
}
});
FloatingActionButton fbMy = (FloatingActionButton) findViewById(R.id.fb_person);
fbMy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragments.get(pager.getCurrentItem()).hideFab();
Intent intent = new Intent(MainShowActivity.this, PersonActivity.class);
startActivity(intent);
}
});
person = getCurrentPerson(MainShowActivity.this);
if (person != null) {
rvBuy.setVisibility(View.VISIBLE);
rvSale.setVisibility(View.VISIBLE);
rvQQ.setVisibility(View.GONE);
rvSina.setVisibility(View.GONE);
if (!TextUtils.isEmpty(person.getUser_icon())) {
ImageLoader.getInstance().displayImage(person.getUser_icon(), rvUser);
}
tvPerson.setText("个人中心");
if (!TextUtils.isEmpty(person.getNickname())) {
tvName.setText(person.getNickname());
} else {
tvName.setText("用户" + person.getUsername().substring(0, 3));
}
tvShow.setText("我的");
} else {
rvUser.setBackground(getResources().getDrawable(R.drawable.defaut));
tvPerson.setText("登录或注册");
tvName.setText("");
rvBuy.setVisibility(View.GONE);
rvSale.setVisibility(View.GONE);
rvQQ.setVisibility(View.VISIBLE);
rvSina.setVisibility(View.VISIBLE);
tvShow.setText("其他登录方式");
}
rvLogReg.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
if (person != null) {
Intent intent = new Intent(MainShowActivity.this, PersonActivity.class);
startActivity(intent);
} else {
Intent intent = new Intent(MainShowActivity.this, LoginActivity.class);
startActivity(intent);
}
}
});
rvBuy.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
drawerLayout.closeDrawers();
}
});
rvSale.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
Intent intent = new Intent(MainShowActivity.this, NewProductActivity.class);
startActivity(intent);
drawerLayout.closeDrawers();
}
});
ArrayList categoryList = new ArrayList<>();
categoryList = (ArrayList) getIntent().getSerializableExtra("categories");
if (categoryList!=null){
if (categoryList.size()>0){
categories.addAll(categoryList);
queryProductsHttp();
}
else {
queryCategory();
}
}
else {
queryCategory();
}
}
private void queryProductsHttp() {
BmobQuery productBmobQuery = new BmobQuery<>();
productBmobQuery.order("-createdAt");
productBmobQuery.findObjects(new FindListener() {
@Override
public void done(List list, BmobException e) {
if (e == null){
if (list != null && list.size() > 0) {
List data = new ArrayList();
for (Product p : list) {
data.add(p);
}
Message msg = new Message();
msg.what = 0;
msg.obj = data;
handler.sendMessage(msg);
}
}
}
});
}
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
//该方法会自动和actionBar关联, 将开关的图片显示在了action上,如果不设置,也可以有抽屉的效果,不过是默认的图标
drawerToggle.syncState();
}
/** 设备配置改变时 */
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item))
return true;
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_person) {
Intent intent = new Intent(MainShowActivity.this, PersonActivity.class);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (floatingActionsMenu.isExpanded()) {
floatingActionsMenu.collapse();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
/**
* Bmob查询分类数据显示选项卡
* by Hankkin at:2015-11-29 19:39:45
*/
private void queryCategory() {
showLoadingDialog();
BmobQuery categoryBmobQuery = new BmobQuery<>();
categoryBmobQuery.order("createdAt");// 按照时间降序
categoryBmobQuery.findObjects(new FindListener() {
@Override
public void done(List list, BmobException e) {
if (e == null){
if (list != null && list.size() > 0) {
categories = new ArrayList();
categories.addAll(list);
queryProductsHttp();
}
}
else {
HankkinUtils.showToast(MainShowActivity.this, e.getMessage());
}
}
});
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/activity/NewProductActivity.java
================================================
package com.hankkin.compustrading.activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.hankkin.compustrading.FileUploadListener;
import com.hankkin.compustrading.R;
import com.hankkin.compustrading.Utils.BitmapUtils;
import com.hankkin.compustrading.Utils.HankkinUtils;
import com.hankkin.compustrading.model.Product;
import com.weiwangcn.betterspinner.library.BetterSpinner;
import java.util.Date;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.SaveListener;
import me.drakeet.materialdialog.MaterialDialog;
public class NewProductActivity extends BaseActivity {
@Bind(R.id.et_tel)
EditText etTel;
@Bind(R.id.et_name)
EditText etName;
@Bind(R.id.et_price)
EditText etPrice;
@Bind(R.id.spinner_school)
BetterSpinner spinnerSchool;
@Bind(R.id.tv_cate)
TextView tvCate;
@Bind(R.id.btn_fabu)
Button btnFabu;
@Bind(R.id.iv_add_pro)
ImageView ivAddPro;
@Bind(R.id.tv_back)
TextView tvBack;
private String[] schools;
private String filePath = "";
private int cid=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_product);
ButterKnife.bind(this);
init();
}
private void init(){
schools = getResources().getStringArray(R.array.school);
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_dropdown_item_1line, schools);
spinnerSchool.setAdapter(adapter);
// String tel = HankkinUtils.getPhoneNumber(NewProductActivity.this);
// if (!TextUtils.isEmpty(tel)){
// etTel.setText(tel);
// }
tvBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
/**
* 选择分类对话框
* by Hankkin at:2015-12-24 17:39:17
*/
@OnClick(R.id.tv_cate)
void showCate(){
final ArrayAdapter arrayAdapter
= new ArrayAdapter(this,
android.R.layout.simple_list_item_1);
final String[] cates = getResources().getStringArray(R.array.cate);
for (int j = 0; j < cates.length; j++) {
arrayAdapter.add(cates[j]);
}
ListView listView = new ListView(this);
listView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
float scale = getResources().getDisplayMetrics().density;
listView.setDividerHeight(1);
listView.setAdapter(arrayAdapter);
final MaterialDialog alert = new MaterialDialog(this).setTitle(
"请选择分类").setContentView(listView);
alert.show();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
String cate = cates[position];
tvCate.setText(cate);
cid = position;
alert.dismiss();
}
});
}
/**
* 选择图片对话框
* by Hankkin at:2015-12-20 23:25:37
*/
@OnClick(R.id.iv_add_pro)
void showMDdialog() {
View view = LayoutInflater.from(NewProductActivity.this).inflate(R.layout.view_select_img, null, false);
final MaterialDialog dialog = new MaterialDialog(this).setView(view);
dialog.show();
TextView tvGallery = (TextView) view.findViewById(R.id.tv_gallery);
tvGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
getImageFromGallery(NewProductActivity.this);
}
});
TextView tvCamera = (TextView) view.findViewById(R.id.tv_camera);
tvCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
filePath = iniFilePath(NewProductActivity.this);
goCamera(NewProductActivity.this, filePath);
}
});
}
/**
* 接受选择照片的结果显示
* by Hankkin at:2015-12-24 17:41:49
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_GALLERY) {
if(data == null){
return;
}
filePath = getAbsoluteImagePath(NewProductActivity.this, data.getData());
if (!TextUtils.isEmpty(filePath)) {
ivAddPro.setImageBitmap(BitmapUtils.getCompressedBitmap(NewProductActivity.this, filePath));
}
} else if (requestCode == REQUST_CODE_CAMERA) {
if (!TextUtils.isEmpty(filePath)) {
Bitmap temp = BitmapUtils.getCompressedBitmap(NewProductActivity.this, filePath);
if(temp==null){
return;
}
ivAddPro.setImageBitmap(temp);
}
}
}
/**
* 发布按钮点击事件
* 上传图片, 创建新商品
* by Hankkin at:2015-12-24 18:33:15
*/
@OnClick(R.id.btn_fabu)
void addNewPro(){
if (!HankkinUtils.isMobileNO(etTel.getText().toString().trim())){
HankkinUtils.showToast(NewProductActivity.this,"请输入正确的手机号");
return;
}
if (TextUtils.isEmpty(etPrice.getText().toString().trim())||
TextUtils.isEmpty(etTel.getText().toString().trim())||
TextUtils.isEmpty(etName.getText().toString().trim())){
HankkinUtils.showToast(NewProductActivity.this,"请完善信息");
return;
}
if (TextUtils.isEmpty(tvCate.getText())||TextUtils.isEmpty(spinnerSchool.getText().toString())){
HankkinUtils.showToast(NewProductActivity.this,"请完善信息");
return;
}
if (!TextUtils.isEmpty(filePath)){
showLoadingDialog();
Bitmap tempBitmap = BitmapUtils.getCompressedBitmap(NewProductActivity.this, filePath);
if (BitmapUtils.readPictureDegree(filePath) == 90) {
tempBitmap = BitmapUtils.toturn(tempBitmap);
}
filePath = BitmapUtils.saveBitmap(tempBitmap,new Date().getTime() + "");
uploadImg(filePath, NewProductActivity.this, new FileUploadListener() {
@Override
public void success(String url) {
Product product = new Product();
product.setName(etName.getText().toString());
product.setCid(cid);
product.setUsername(getCurrentPerson(NewProductActivity.this).getNickname());
product.setPrice(etPrice.getText().toString());
product.setSchool(spinnerSchool.getText().toString());
product.setProduct_url(url);
product.setUser_tel(etTel.getText().toString());
product.setUser_icon_url(getCurrentPerson(NewProductActivity.this).getUser_icon());
addProHttp(product);
}
@Override
public void fail() {
dimissDialog();
HankkinUtils.showToast(NewProductActivity.this, "发布失败");
}
});
}
}
/**
* 保存新商品
* by Hankkin at:2015-12-24 18:32:38
* @param product
*/
private void addProHttp(final Product product){
product.save(new SaveListener() {
@Override
public void done(String s, BmobException e) {
if (e == null){
dimissDialog();
HankkinUtils.showToast(NewProductActivity.this, "发布成功");
finish();
}
else {
dimissDialog();
HankkinUtils.showToast(NewProductActivity.this,"发布失败");
}
}
});
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/activity/PersonActivity.java
================================================
package com.hankkin.compustrading.activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.hankkin.compustrading.FileUploadListener;
import com.hankkin.compustrading.R;
import com.hankkin.compustrading.Utils.BitmapUtils;
import com.hankkin.compustrading.Utils.HankkinUtils;
import com.hankkin.compustrading.model.Person;
import com.hankkin.compustrading.model.PersonShow;
import com.hankkin.compustrading.view.PullToZoomScrollViewEx;
import com.hankkin.compustrading.view.RippleView;
import com.hankkin.compustrading.view.RoundedImageView;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import butterknife.Bind;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.UpdateListener;
import me.drakeet.materialdialog.MaterialDialog;
public class PersonActivity extends BaseActivity {
@Bind(R.id.tv_back)
TextView tvBack;
private PullToZoomScrollViewEx scrollView;
private List data = new ArrayList<>();
private TextView tvLogin, tvRegister;
private RoundedImageView ivUserIcon;
View headView;
View zoomView;
View contentView;
public static PersonActivity instance;
private String filePath = "";
private RippleView rvLogout;
private RippleView rvBuy;
private RippleView rvSale;
private TextView tvLogout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
setContentView(R.layout.activity_person);
initViews();
initData();
}
private void initViews() {
tvBack = (TextView) findViewById(R.id.tv_back);
scrollView = (PullToZoomScrollViewEx) findViewById(R.id.my_pull_scoll);
loadViewForCode();
scrollView.getPullRootView().findViewById(R.id.tv_test1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
DisplayMetrics localDisplayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(localDisplayMetrics);
int mScreenHeight = localDisplayMetrics.heightPixels;
int mScreenWidth = localDisplayMetrics.widthPixels;
LinearLayout.LayoutParams localObject = new LinearLayout.LayoutParams(mScreenWidth, (int) (9.0F * (mScreenWidth / 16.0F)));
scrollView.setHeaderLayoutParams(localObject);
tvBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
private void initData() {
Person person = Person.getCurrentUser(Person.class);
if (person != null) {
ImageLoader.getInstance().displayImage(person.getUser_icon(), ivUserIcon);
tvLogin.setVisibility(View.GONE);
tvRegister.setVisibility(View.GONE);
tvLogout.setText("退出账号");
} else {
tvLogin.setVisibility(View.VISIBLE);
tvRegister.setVisibility(View.VISIBLE);
ivUserIcon.setImageDrawable(getResources().getDrawable(R.drawable.defaut));
tvLogout.setText("登录");
}
}
private void loadViewForCode() {
PullToZoomScrollViewEx scrollView = (PullToZoomScrollViewEx) findViewById(R.id.my_pull_scoll);
headView = LayoutInflater.from(this).inflate(R.layout.profile_head_view, null, false);
zoomView = LayoutInflater.from(this).inflate(R.layout.profile_zoom_view, null, false);
contentView = LayoutInflater.from(this).inflate(R.layout.profile_contect_view, null, false);
scrollView.setHeaderView(headView);
scrollView.setZoomView(zoomView);
scrollView.setScrollContentView(contentView);
tvLogin = (TextView) headView.findViewById(R.id.tv_login);
tvRegister = (TextView) headView.findViewById(R.id.tv_register);
ivUserIcon = (RoundedImageView) headView.findViewById(R.id.iv_user_head);
rvLogout = (RippleView) contentView.findViewById(R.id.rv_logout);
tvLogout = (TextView) contentView.findViewById(R.id.tv_logout);
rvLogout.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
Person.logOut();
HankkinUtils.showToast(PersonActivity.this, "已注销");
initData();
finish();
}
});
rvBuy = (RippleView) contentView.findViewById(R.id.rv_buy);
rvBuy.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
finish();
}
});
rvSale = (RippleView) contentView.findViewById(R.id.rv_sale);
rvSale.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
Intent intent = new Intent(PersonActivity.this,NewProductActivity.class);
startActivity(intent);
finish();
}
});
tvLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(PersonActivity.this, LoginActivity.class);
startActivity(intent);
}
});
tvRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(PersonActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
ivUserIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getCurrentPerson(PersonActivity.this)!=null){
showMDdialog();
}
}
});
}
/**
* 选择图片对话框
* by Hankkin at:2015-12-20 23:25:37
*/
private void showMDdialog() {
View view = LayoutInflater.from(PersonActivity.this).inflate(R.layout.view_select_img, null, false);
final MaterialDialog dialog = new MaterialDialog(this).setView(view);
dialog.show();
TextView tvGallery = (TextView) view.findViewById(R.id.tv_gallery);
tvGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
getImageFromGallery(PersonActivity.this);
}
});
TextView tvCamera = (TextView) view.findViewById(R.id.tv_camera);
tvCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
filePath = iniFilePath(PersonActivity.this);
goCamera(PersonActivity.this, filePath);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_GALLERY) {
showLoadingDialog();
filePath = getPath(PersonActivity.this, data.getData());
if (!TextUtils.isEmpty(filePath)) {
uploadImg(filePath, PersonActivity.this, new FileUploadListener() {
@Override
public void success(final String url) {
Person person = Person.getCurrentUser( Person.class);
person.setUser_icon(url);
ImageLoader.getInstance().displayImage(url, ivUserIcon);
updateUser(person);
}
@Override
public void fail() {
dimissDialog();
HankkinUtils.showToast(PersonActivity.this, "上传失败");
}
});
}
} else if (requestCode == REQUST_CODE_CAMERA) {
showLoadingDialog();
if (!TextUtils.isEmpty(filePath)) {
Bitmap tempBitmap = BitmapUtils.getCompressedBitmap(PersonActivity.this, filePath);
if (BitmapUtils.readPictureDegree(filePath) == 90) {
tempBitmap = BitmapUtils.toturn(tempBitmap);
}
filePath = BitmapUtils.saveBitmap(tempBitmap,new Date().getTime() + "");
uploadImg(filePath, PersonActivity.this, new FileUploadListener() {
@Override
public void success(String url) {
Person person = Person.getCurrentUser(Person.class);
person.setUser_icon(url);
// MyImageLoader.getInstance().displayImage(PersonActivity.this,url, ivUserIcon);
ImageLoader.getInstance().displayImage(url, ivUserIcon);
updateUser(person);
}
@Override
public void fail() {
dimissDialog();
HankkinUtils.showToast(PersonActivity.this, "上传失败");
}
});
}
}
}
/**
* 更新个人用户信息
* by Hankkin at:2015-12-23 19:34:17
*
* @param person
*/
private void updateUser(Person person) {
person.update(person.getObjectId(), new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null){
dimissDialog();
HankkinUtils.showToast(PersonActivity.this, "上传成功");
}
}
});
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/activity/ProdectDetailActivity.java
================================================
package com.hankkin.compustrading.activity;
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import com.hankkin.compustrading.R;
import com.hankkin.compustrading.Utils.HankkinUtils;
import com.hankkin.compustrading.model.Product;
import com.nostra13.universalimageloader.core.ImageLoader;
public class ProdectDetailActivity extends AppCompatActivity {
private Product product;
private TextView tvDesc,tvProName,tvTime,tvSchool,tvPrice;
private ImageView ivPro;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prodect_detail);
product = (Product) getIntent().getSerializableExtra("product");
tvDesc = (TextView) findViewById(R.id.tv_pro_desc);
tvProName = (TextView) findViewById(R.id.tv_pro_name);
ivPro = (ImageView) findViewById(R.id.iv_product);
tvTime = (TextView) findViewById(R.id.tv_time);
tvSchool = (TextView) findViewById(R.id.tv_school);
tvPrice = (TextView) findViewById(R.id.tv_price);
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
toolbar.inflateMenu(R.menu.menu_prodect_detail);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_share:
HankkinUtils.showToast(ProdectDetailActivity.this, "分享");
break;
case R.id.action_settings:
HankkinUtils.showToast(ProdectDetailActivity.this, "举报");
break;
}
return false;
}
});
CollapsingToolbarLayout collapsingAvatarToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
collapsingAvatarToolbar.setBackgroundColor(getResources().getColor(R.color.theme_color));
collapsingAvatarToolbar.setExpandedTitleGravity(Gravity.CENTER_VERTICAL);
collapsingAvatarToolbar.setExpandedTitleColor(getResources().getColor(R.color.theme_color));
TextView tv = (TextView) findViewById(R.id.username);
tv.setText(product.getUsername());
tvProName.setText(product.getName());
tvDesc.setText(product.getDesc());
ImageLoader.getInstance().displayImage(product.getProduct_url(),ivPro);
tvPrice.setText("¥" + product.getPrice());
tvSchool.setText(product.getSchool());
tvTime.setText(product.getCreatedAt());
}
}
================================================
FILE: app/src/main/java/com/hankkin/compustrading/activity/RegisterActivity.java
================================================
package com.hankkin.compustrading.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.hankkin.compustrading.R;
import com.hankkin.compustrading.Utils.HankkinUtils;
import com.hankkin.compustrading.model.Person;
import com.hankkin.compustrading.sharepreference.MySP;
import com.pnikosis.materialishprogress.ProgressWheel;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.LogInListener;
import cn.bmob.v3.listener.SaveListener;
public class RegisterActivity extends AppCompatActivity {
@Bind(R.id.btn_register)
Button btnRegister;
@Bind(R.id.et_login_name)
EditText etName;
@Bind(R.id.et_login_pwd)
EditText etPwd;
@Bind(R.id.tv_back)
TextView tvBack;
@Bind(R.id.pw_loading)
ProgressWheel wheel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
ButterKnife.bind(this);
initViews();
}
private void initViews(){
wheel.stopSpinning();
}
/**
* 注册用户
* by Hankkin at:2015-12-20 21:13:02
*/
@OnClick(R.id.btn_register)
public void register(View view){
wheel.spin();
final String name = etName.getText().toString().trim();
final String pwd = etPwd.getText().toString().trim();
if (TextUtils.isEmpty(name)){
HankkinUtils.showToast(RegisterActivity.this,"用户名不能为空");
return;
}
if (TextUtils.isEmpty(pwd)){
HankkinUtils.showToast(RegisterActivity.this,"密码不能为空");
return;
}
if (!HankkinUtils.isMobileNO(name)){
HankkinUtils.showToast(RegisterActivity.this,"请输入正确的手机号");
return;
}
Person person = new Person();
person.setUsername(name);
person.setPassword(pwd);
person.signUp(new SaveListener