diff --git a/PersonalCenter/app/build.gradle b/PersonalCenter/app/build.gradle index 82077c6..818ca07 100644 --- a/PersonalCenter/app/build.gradle +++ b/PersonalCenter/app/build.gradle @@ -40,5 +40,6 @@ dependencies { compile files('libs/android-async-http-1.4.8.jar') compile 'com.google.code.gson:gson:2.7' compile 'com.zaaach:toprightmenu:1.0' + compile 'com.facebook.fresco:fresco:1.1.0' } diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/FeedBackActivity.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/FeedBackActivity.java index bca619f..c5c47b8 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/FeedBackActivity.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/FeedBackActivity.java @@ -1,18 +1,263 @@ package com.hjx.personalcenter.activity; -import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.v4.content.FileProvider; +import android.support.v7.app.AppCompatActivity; +import android.view.Gravity; +import android.view.View; +import android.widget.AdapterView; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.generic.GenericDraweeHierarchy; +import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; +import com.facebook.drawee.generic.RoundingParams; +import com.facebook.drawee.interfaces.DraweeController; +import com.facebook.drawee.view.SimpleDraweeView; import com.hjx.personalcenter.R; +import com.hjx.personalcenter.util.CropUtils; +import com.hjx.personalcenter.util.DialogPermission; +import com.hjx.personalcenter.util.FileUtil; +import com.hjx.personalcenter.util.PermissionUtil; +import com.hjx.personalcenter.util.SharedPreferenceMark; +import com.mylhyl.circledialog.CircleDialog; +import com.mylhyl.circledialog.callback.ConfigButton; +import com.mylhyl.circledialog.callback.ConfigDialog; +import com.mylhyl.circledialog.params.ButtonParams; +import com.mylhyl.circledialog.params.DialogParams; + +import java.io.File; /** * Created by h on 2017/8/11. */ -public class FeedBackActivity extends Activity{ +public class FeedBackActivity extends AppCompatActivity implements View.OnClickListener { + private ImageView iv_cance,iv_show,iv_take; + private EditText content, phone; + private TextView tv_sub; + private static final int REQUEST_CODE_TAKE_PHOTO = 1; + private static final int REQUEST_CODE_ALBUM = 2; + private static final int REQUEST_CODE_CROUP_PHOTO = 3; + SimpleDraweeView mSimpleDraweeView; + private File file; + private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Fresco.initialize(this); setContentView(R.layout.activity_feedback); + initView(); + initData(); + initLister(); + } + + private void initView() { + iv_cance = (ImageView) findViewById(R.id.cancel); + mSimpleDraweeView = (SimpleDraweeView) findViewById(R.id.show_iv); + iv_take = (ImageView) findViewById(R.id.iv_take); + content = (EditText) findViewById(R.id.feedback_content); + phone = (EditText) findViewById(R.id.feedback_phone); + tv_sub = (TextView) findViewById(R.id.feedback_sub); + + } + + private void initData() { + file = new File(FileUtil.getCachePath(this), "user-avatar.jpg"); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + uri = Uri.fromFile(file); + } else { + //通过FileProvider创建一个content类型的Uri(android 7.0需要这样的方法跨应用访问) + uri = FileProvider.getUriForFile(MyApplication.getContext(), "com.hjx.personalcenter", file); + } + + } + + private void initLister() { + iv_cance.setOnClickListener(this); + iv_take.setOnClickListener(this); + tv_sub.setOnClickListener(this); + + } + + @Override + public void onClick(View v) { + switch (v.getId()){ + case R.id.cancel: + finish(); + break; + case R.id.iv_take: + choiceAvatar(); + break; + case R.id.feedback_sub: + break; + } + } + + //拍摄头像 + private void choiceAvatar() { + final String[] items = {"拍照", "从相册选择"}; + new CircleDialog.Builder(this) + .configDialog(new ConfigDialog() { + @Override + public void onConfig(DialogParams params) { + //增加弹出动画 + params.gravity = Gravity.CENTER; + } + }) + .setTitle("请选择图片来源") + .setWidth(0.5f) + .setItems(items, new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int + position, long id) { + switch (position){ + case 0: + if (PermissionUtil.hasCameraPermission(FeedBackActivity.this)) { + uploadAvatarFromPhotoRequest(); + } + break; + case 1: + uploadAvatarFromAlbumRequest(); + break; + } + + } + }) + .setNegative("取消", null) + .configNegative(new ConfigButton() { + @Override + public void onConfig(ButtonParams params) { + //取消按钮字体颜色 + params.textColor = Color.RED; + } + }) + .show(); + + + } + //照相 + private void uploadAvatarFromPhotoRequest() { + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0); + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); + startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO); + } + + //选择图库 + private void uploadAvatarFromAlbumRequest() { + Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); + photoPickerIntent.setType("image/*"); + startActivityForResult(photoPickerIntent, REQUEST_CODE_ALBUM); + } + //回掉 + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode != -1) { + return; + } + if (requestCode == REQUEST_CODE_ALBUM && data != null) { + Uri newUri; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + newUri = Uri.parse("file:///" + CropUtils.getPath(this, data.getData())); + } else { + newUri = data.getData(); + } + if (newUri != null) { + startPhotoZoom(newUri); + } else { + Toast.makeText(this, "没有得到相册图片", Toast.LENGTH_LONG).show(); + } + } else if (requestCode == REQUEST_CODE_TAKE_PHOTO) { + startPhotoZoom(uri); + } else if (requestCode == REQUEST_CODE_CROUP_PHOTO) { + uploadAvatarFromPhoto(); + } + } + + private void uploadAvatarFromPhoto() { + compressAndUploadAvatar(file.getPath()); + + } + private void compressAndUploadAvatar(String fileSrc) { + + + //上传到服务器 + + final File cover = FileUtil.getSmallBitmap(this, fileSrc); + String mimeType = "image/*"; + //requestBody = RequestBody.create(MediaType.parse(mimeType), file); + //String fileName = cover.getName(); + //HttpManager.getInstance().header(this, fileSrc); + //photo = MultipartBody.Part.createFormData("portrait", fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length()), requestBody); + //Fresco设置圆形头像 + GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources()); + GenericDraweeHierarchy hierarchy = builder + .setDesiredAspectRatio(1f) + .setFailureImage(R.mipmap.blank) + //圆形头像 + .setRoundingParams(RoundingParams.asCircle()) + .build(); + + //加载本地图片 + Uri uri = Uri.fromFile(cover); + DraweeController controller = Fresco.newDraweeControllerBuilder() + .setOldController(mSimpleDraweeView.getController()) + .setUri(uri) + .build(); + mSimpleDraweeView.setHierarchy(hierarchy); + mSimpleDraweeView.setController(controller); + + } + + public void startPhotoZoom(Uri uri) { + Intent intent = new Intent("com.android.camera.action.CROP"); + intent.setDataAndType(uri, "image/*"); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.putExtra("crop", "true");// crop=true 有这句才能出来最后的裁剪页面. + intent.putExtra("aspectX", 1);// 这两项为裁剪框的比例. + intent.putExtra("aspectY", 1);// x:y=1:1 +// intent.putExtra("outputX", 400);//图片输出大小 +// intent.putExtra("outputY", 400); + intent.putExtra("output", Uri.fromFile(file)); + intent.putExtra("outputFormat", "JPEG");// 返回格式 + startActivityForResult(intent, REQUEST_CODE_CROUP_PHOTO); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode) { + + case PermissionUtil.REQUEST_SHOWCAMERA: + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + // Permission Granted + uploadAvatarFromPhotoRequest(); + + } else { + if (!SharedPreferenceMark.getHasShowCamera()) { + SharedPreferenceMark.setHasShowCamera(true); + new DialogPermission(this, "关闭摄像头权限影响扫描功能"); + + } else { + Toast.makeText(this, "未获取摄像头权限", Toast.LENGTH_SHORT) + .show(); + } + } + break; + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } } } diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/MyApplication.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/MyApplication.java new file mode 100644 index 0000000..a704589 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/MyApplication.java @@ -0,0 +1,39 @@ +package com.hjx.personalcenter.activity; + +import android.app.Application; +import android.content.Context; + +import com.facebook.drawee.backends.pipeline.Fresco; +import com.hjx.personalcenter.util.ImageCache; +import com.tencent.bugly.crashreport.CrashReport; + +/** + * Created by ${yf} on 2017/2/16. + */ + +public class MyApplication extends Application { + + private ImageCache mImageCache; + private static Context context; + private static MyApplication instance; + @Override + public void onCreate() { + super.onCreate(); + context = getApplicationContext(); + //初始化Fresco + Fresco.initialize(this); + mImageCache = new ImageCache(); + instance = this; + CrashReport.initCrashReport(getApplicationContext(), "c2170557a0", false); + } + public ImageCache getImageCache() { + return mImageCache; + } + + public static Context getContext() { + return context; + } + public static MyApplication getInstance() { + return instance; + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/RegisterInfoActivity.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/RegisterInfoActivity.java index 91da830..45f66f6 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/RegisterInfoActivity.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/RegisterInfoActivity.java @@ -3,6 +3,8 @@ package com.hjx.personalcenter.activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.view.KeyEvent; import android.view.View; import android.widget.AdapterView; import android.widget.Button; @@ -12,8 +14,10 @@ import android.widget.TextView; import com.hjx.personalcenter.R; import com.hjx.personalcenter.customdialog.GradeListDialog; import com.hjx.personalcenter.customdialog.ProvinceListDialog; +import com.hjx.personalcenter.customdialog.SchoolListDialog; import com.hjx.personalcenter.http.HttpManager; import com.hjx.personalcenter.interfaces.DialogCallBack; +import com.hjx.personalcenter.util.AlertUtils; /**填写注册信息 熊巍 * Created by h on 2017/8/9. @@ -23,7 +27,6 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl private EditText et_username; private TextView et_region,et_grade,et_school; private Button btn_ok; - String[] items; @Override protected void onCreate(Bundle savedInstanceState) { @@ -45,7 +48,6 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl } private void initData() { - items = new String[] { "魏", "蜀", "吴" }; } @@ -60,6 +62,10 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl @Override public void onClick(View v) { + String register1 = et_username.getText().toString().trim(); + String register2 = et_region.getText().toString().trim(); + String register3 = et_grade.getText().toString().trim(); + String register4 = et_school.getText().toString().trim(); switch (v.getId()){ case R.id.et_region: choiseregion(); @@ -68,17 +74,32 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl choisegrade(); break; case R.id.et_school: + if (TextUtils.isEmpty(register2) || TextUtils.isEmpty(register3)){ + AlertUtils.showToast(RegisterInfoActivity.this, "请选择年级和地址"); + return; + }else { + choiseschool(); + } + break; case R.id.btn_ok: - Intent intent = new Intent(); - intent.setClass(RegisterInfoActivity.this,ChoiseTextBookActivity.class); - startActivity(intent); - overridePendingTransition(R.anim.rightin, R.anim.rightout); + if (TextUtils.isEmpty(register1)||TextUtils.isEmpty(register4) || + TextUtils.isEmpty(register2) || TextUtils.isEmpty(register3)){ + AlertUtils.showToast(RegisterInfoActivity.this, "请将必填项填写完整"); + return; + }else{ + Intent intent = new Intent(); + intent.setClass(RegisterInfoActivity.this,ChoiseTextBookActivity.class); + startActivity(intent); + overridePendingTransition(R.anim.rightin, R.anim.rightout); + } + break; } } -//选择地区 + + //选择地区 private void choiseregion() { HttpManager.getInstance().provices(RegisterInfoActivity.this); ProvinceListDialog.getInstance(this).show(getSupportFragmentManager(), "ProvinceListDialog"); @@ -88,9 +109,17 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl } //选择年级 private void choisegrade() { + HttpManager.getInstance().getgrade(RegisterInfoActivity.this); GradeListDialog.getInstance().show(getSupportFragmentManager(), "GradeListDialog"); } + //选择学校 + private void choiseschool() { + HttpManager.getInstance().getschool(RegisterInfoActivity.this,130102,14); + SchoolListDialog.getInstance().show(getSupportFragmentManager(), "SchoolListDialog"); + + } + @Override public void provinceOnItemClick(AdapterView parent, View view, int position, long id) { @@ -101,4 +130,12 @@ public class RegisterInfoActivity extends AppCompatActivity implements View.OnCl } + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + finish(); + + } + return super.onKeyUp(keyCode, event); + } } diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/adapter/GrandeAdapter.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/adapter/GrandeAdapter.java new file mode 100644 index 0000000..454a7ce --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/adapter/GrandeAdapter.java @@ -0,0 +1,65 @@ +package com.hjx.personalcenter.adapter; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.hjx.personalcenter.R; +import com.hjx.personalcenter.model.GradeInfo; + +import java.util.ArrayList; + +/** + * Created by h on 2017/8/21. + */ + +public class GrandeAdapter extends BaseAdapter{ + ArrayList objects; + private Context context; + + public GrandeAdapter(ArrayList objects, Context context) { + this.objects = objects; + this.context = context; + } + + @Override + public int getCount() { + return objects.size(); + } + + @Override + public Object getItem(int position) { + return position; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + + ProvincesAdapter.ViewHolder holder = null; + + if (convertView == null) { + convertView = View.inflate(context, R.layout.custom_adilog_list_item, null); + holder = new ProvincesAdapter.ViewHolder(); + holder.nameText = (TextView) convertView.findViewById(R.id.list_items); + convertView.setTag(holder); + } else { + holder = (ProvincesAdapter.ViewHolder) convertView.getTag(); + } + + holder.nameText.setText(objects.get(position).getName()); + + return convertView; + } + + + static class ViewHolder { + TextView nameText; + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/adapter/SchoolAdapter.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/adapter/SchoolAdapter.java new file mode 100644 index 0000000..9271e65 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/adapter/SchoolAdapter.java @@ -0,0 +1,151 @@ +package com.hjx.personalcenter.adapter; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.TextView; + +import com.hjx.personalcenter.R; +import com.hjx.personalcenter.model.SchoolInfo; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by h on 2017/8/21. + */ + +public class SchoolAdapter extends BaseAdapter implements Filterable { + private List mDatas; + ArrayList objects; + private Context context; + private final Object mLock = new Object(); + private ArrayFilter mFilter; + + public SchoolAdapter(ArrayList objects, Context context) { + this.objects = objects; + this.context = context; + } + + @Override + public int getCount() { + return objects.size(); + } + + @Override + public Object getItem(int position) { + return position; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + + ProvincesAdapter.ViewHolder holder = null; + + if (convertView == null) { + convertView = View.inflate(context, R.layout.custom_adilog_school_list_items, null); + holder = new ProvincesAdapter.ViewHolder(); + holder.nameText = (TextView) convertView.findViewById(R.id.list_school_items); + convertView.setTag(holder); + } else { + holder = (ProvincesAdapter.ViewHolder) convertView.getTag(); + } + + holder.nameText.setText(objects.get(position).getSchoolName()); + + return convertView; + } + + @Override + public Filter getFilter() { + if (mFilter == null) { + mFilter = new ArrayFilter(); + } + return mFilter; + } + + + static class ViewHolder { + TextView nameText; + } + private class ArrayFilter extends Filter { + //执行刷选 + @Override + protected FilterResults performFiltering(CharSequence prefix) { + FilterResults results = new FilterResults();//过滤的结果 + //原始数据备份为空时,上锁,同步复制原始数据 + if (objects == null) { + synchronized (mLock) { + objects = new ArrayList<>(mDatas); + } + } + //当首字母为空时 + if (prefix == null || prefix.length() == 0) { + ArrayList list; + synchronized (mLock) {//同步复制一个原始备份数据 + list = new ArrayList<>(objects); + } + results.values = list; + results.count = list.size();//此时返回的results就是原始的数据,不进行过滤 + } else { + String prefixString = prefix.toString().toLowerCase();//转化为小写 + + ArrayList values; + synchronized (mLock) {//同步复制一个原始备份数据 + values = new ArrayList<>(objects); + } + final int count = values.size(); + final ArrayList newValues = new ArrayList<>(); + + for (int i = 0; i < count; i++) { + final SchoolInfo.DataBean value = values.get(i);//从List中拿到User对象 +// final String valueText = value.toString().toLowerCase(); + final String valueText = value.getSchoolName().toString().toLowerCase();//User对象的name属性作为过滤的参数 + // First match against the whole, non-splitted value + if (valueText.startsWith(prefixString) || valueText.indexOf(prefixString.toString()) != -1) {//第一个字符是否匹配 + newValues.add(value);//将这个item加入到数组对象中 + } else {//处理首字符是空格 + final String[] words = valueText.split(" "); + final int wordCount = words.length; + + // Start at index 0, in case valueText starts with space(s) + for (int k = 0; k < wordCount; k++) { + if (words[k].startsWith(prefixString)) {//一旦找到匹配的就break,跳出for循环 + newValues.add(value); + break; + } + } + } + } + results.values = newValues;//此时的results就是过滤后的List数组 + results.count = newValues.size(); + } + return results; + } + + //刷选结果 + @Override + protected void publishResults(CharSequence prefix, FilterResults results) { + //noinspection unchecked + mDatas = (List) results.values;//此时,Adapter数据源就是过滤后的Results + if (results.count > 0) { + notifyDataSetChanged();//这个相当于从mDatas中删除了一些数据,只是数据的变化,故使用notifyDataSetChanged() + } else { + /** + * 数据容器变化 ----> notifyDataSetInValidated + + 容器中的数据变化 ----> notifyDataSetChanged + */ + notifyDataSetInvalidated();//当results.count<=0时,此时数据源就是重新new出来的,说明原始的数据源已经失效了 + } + } + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/GradeListDialog.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/GradeListDialog.java index 40ba7d4..3a15198 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/GradeListDialog.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/GradeListDialog.java @@ -8,11 +8,14 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import com.hjx.personalcenter.R; +import com.hjx.personalcenter.adapter.GrandeAdapter; +import com.hjx.personalcenter.db.SaveParam; +import com.hjx.personalcenter.http.HttpManager; +import com.hjx.personalcenter.model.GradeInfo; import com.mylhyl.circledialog.BaseCircleDialog; import com.mylhyl.circledialog.res.values.CircleDimen; @@ -23,9 +26,9 @@ import java.util.ArrayList; */ public class GradeListDialog extends BaseCircleDialog implements AdapterView.OnItemClickListener { - ArrayAdapter listadapter; - ListView listView; - ArrayList data = new ArrayList<>(); + private GrandeAdapter listadapter; + private ListView listView; + ArrayList data = new ArrayList<>(); public static GradeListDialog getInstance() { GradeListDialog dialogFragment = new GradeListDialog(); dialogFragment.setCanceledBack(true); @@ -45,11 +48,18 @@ public class GradeListDialog extends BaseCircleDialog implements AdapterView.OnI public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); listView = (ListView) getView().findViewById(R.id.listadapter); - for (int i=0;i<=50;i++){ - data.add("sss"+i); - } + String gradens = SaveParam.getInstance().getLoginParam(getActivity(), SaveParam.GRADENS); + if (gradens != null) { - listadapter = new ArrayAdapter(getActivity(),R.layout.custom_adilog_list_item,R.id.list_items,data); + for (int i = 0; i < gradens.split(",").length; i++) { + GradeInfo.DataBean dataBean = new GradeInfo.DataBean(); + dataBean.setName(gradens.split(",")[i]); + data.add(dataBean); + } + } else { + HttpManager.getInstance().getgrade(getActivity()); + } + listadapter = new GrandeAdapter(data,getActivity()); listView.setAdapter(listadapter); listView.setOnItemClickListener(this); diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/SchoolListDialog.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/SchoolListDialog.java new file mode 100644 index 0000000..c366380 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/customdialog/SchoolListDialog.java @@ -0,0 +1,119 @@ +package com.hjx.personalcenter.customdialog; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.EditText; +import android.widget.ListView; + +import com.hjx.personalcenter.R; +import com.hjx.personalcenter.adapter.SchoolAdapter; +import com.hjx.personalcenter.db.SaveParam; +import com.hjx.personalcenter.http.HttpManager; +import com.hjx.personalcenter.interfaces.DialogCallBack; +import com.hjx.personalcenter.model.SchoolInfo; +import com.mylhyl.circledialog.BaseCircleDialog; +import com.mylhyl.circledialog.res.values.CircleDimen; + +import java.util.ArrayList; + +/** + * Created by h on 2017/8/21. + */ + +public class SchoolListDialog extends BaseCircleDialog implements AdapterView.OnItemClickListener, View.OnClickListener { + private ListView school_list; + private EditText school_sech; + private SchoolAdapter listadapter; + private View mView; + boolean isFilter; + private DialogCallBack.CallBackView mCallBack; + ArrayList data = new ArrayList<>(); + +// public SchoolListDialog(DialogCallBack.CallBackView callBack) { +// this.mCallBack = callBack; +// } + + public static SchoolListDialog getInstance() { + SchoolListDialog dialogFragment = new SchoolListDialog(); + dialogFragment.setCanceledBack(true); + dialogFragment.setCanceledOnTouchOutside(true); + dialogFragment.setRadius(CircleDimen.RADIUS); + dialogFragment.setWidth(0.5f); + dialogFragment.setGravity(Gravity.CENTER); + dialogFragment.setBackgroundColor(Color.WHITE); + return dialogFragment; + } + + @Override + public View createView(Context context, LayoutInflater inflater, ViewGroup container) { + + if (mView == null) { + mView = inflater.inflate(R.layout.custom_adilog_school_list, container, false); + //mCallBack.provinceOnItemClick(context, inflater, container); + } + return mView; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + school_list = (ListView) getView().findViewById(R.id.listschooladapter); + school_sech = (EditText) getView().findViewById(R.id.et_school_sech); + String gradens = SaveParam.getInstance().getLoginParam(getActivity(), SaveParam.SCHOOL); + if (gradens != null) { + + for (int i = 0; i < gradens.split(",").length; i++) { + SchoolInfo.DataBean dataBean = new SchoolInfo.DataBean(); + dataBean.setSchoolName(gradens.split(",")[i]); + data.add(dataBean); + } + } else { + HttpManager.getInstance().getschool(getActivity(),130102,14); + } + listadapter = new SchoolAdapter(data, getActivity()); + school_list.setAdapter(listadapter); + school_list.setOnItemClickListener(this); + school_sech.setOnClickListener(this); + intiEditView(); + + + } + private void intiEditView() { + school_sech.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { +// mAdapter.getFilter().filter(s); + + listadapter.getFilter().filter(s); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + } + + @Override + public void onClick(View v) { + + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/db/SaveParam.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/db/SaveParam.java index f1a4e4a..c6ddc98 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/db/SaveParam.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/db/SaveParam.java @@ -14,6 +14,9 @@ public class SaveParam { return instance; } //个人信息 + public static String GRADENS = "gradens";//年级 + public static String SCHOOL = "school";//学校 + //电子保卡信息 public static String CARDPHONE = "cardphone";//保卡手机号 public static String CUNSTEMNAME = "cunstemname";//客户姓名 @@ -22,9 +25,10 @@ public class SaveParam { public static String SHOPADRESS = "shopadress";//购买地址 public static String SHOPTLEPHONE = "shoptlephone";//售后电话 - //省市区参数 + //省市区参数、 public static String PROVINCES = "provinces";//省 - public static String CITYS = "citys"; + public static String CITYS = "citys";//市 + public static String COUNTRY = "country";//区 public void saveLoginParam(Context context,String spname, String spstr) { diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpManager.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpManager.java index 0174670..2f1b15d 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpManager.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpManager.java @@ -22,7 +22,9 @@ import com.hjx.personalcenter.db.SaveParam; import com.hjx.personalcenter.gson.GsonTool; import com.hjx.personalcenter.model.CityInfo; import com.hjx.personalcenter.model.CountyInfo; +import com.hjx.personalcenter.model.GradeInfo; import com.hjx.personalcenter.model.ProvinceInfo; +import com.hjx.personalcenter.model.SchoolInfo; import com.hjx.personalcenter.util.DialogPermission; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.JsonHttpResponseHandler; @@ -632,7 +634,7 @@ public class HttpManager { HttpClient.getInstance().get(HttpUrl.cardcheck+ "?userId=" + userId, new AsyncHttpResponseHandler() { @Override public void onSuccess(int arg0, Header[] arg1, byte[] arg2) { - Log.e("test", "省" + new String(arg2)); + Log.e("test", "---" + new String(arg2)); Message msg = Message.obtain(); msg.what = HttpCode.CHECKCARD; msg.obj = new String(arg2); @@ -669,6 +671,98 @@ public class HttpManager { }); } + ///获取年级 + public void getgrade(final Context mContext) { + HttpClient.getInstance().addHeader("Accept", "application/json"); + HttpClient.getInstance().get(HttpUrl.gradesUrl, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int arg0, Header[] arg1, byte[] arg2) { + Log.e("test", "年级" + new String(arg2)); + GradeInfo gradensInfo = GsonTool.getPerson(new String(arg2), GradeInfo.class);//解析json数据 + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < gradensInfo.getData().size(); i++) { + sb.append(gradensInfo.getData().get(i).getName() + ","); + + } + Log.e("test", "年级" + sb.toString()); + SaveParam.getInstance().saveLoginParam(mContext, SaveParam.GRADENS, "" + sb.toString()); + + + } + + @Override + public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) { + new CircleDialog.Builder((FragmentActivity) mContext) + .setCanceledOnTouchOutside(false) + .setCancelable(false) + .setWidth(0.5f) + .configText(new ConfigText() { + @Override + public void onConfig(TextParams params) { + params.gravity = Gravity.CENTER; + params.padding = new int[]{50, 50, 50, 50}; + } + }) + .setText("当前无网络,请检查网络设置") + .setNegative("继续使用", null) + .setPositive("设置网络", new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Settings.ACTION_SETTINGS);//系统设置界面 + mContext.startActivity(intent); + } + }) + .show(); + } + }); + } + ///获取学校 + public void getschool(final Context mContext,int regionId,int gradeId) { + HttpClient.getInstance().addHeader("Accept", "application/json"); + HttpClient.getInstance().get(HttpUrl.schoolUrl+ "?regionId=" + regionId+ "&gradeId=" + gradeId, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int arg0, Header[] arg1, byte[] arg2) { + Log.e("test", "学校" + new String(arg2)); + SchoolInfo schoolInfo = GsonTool.getPerson(new String(arg2), SchoolInfo.class);//解析json数据 + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < schoolInfo.getData().size(); i++) { + sb.append(schoolInfo.getData().get(i).getSchoolName() + ","); + + } + Log.e("test", "学校" + sb.toString()); + SaveParam.getInstance().saveLoginParam(mContext, SaveParam.SCHOOL, "" + sb.toString()); + + + } + + @Override + public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) { + new CircleDialog.Builder((FragmentActivity) mContext) + .setCanceledOnTouchOutside(false) + .setCancelable(false) + .setWidth(0.5f) + .configText(new ConfigText() { + @Override + public void onConfig(TextParams params) { + params.gravity = Gravity.CENTER; + params.padding = new int[]{50, 50, 50, 50}; + } + }) + .setText("当前无网络,请检查网络设置") + .setNegative("继续使用", null) + .setPositive("设置网络", new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Settings.ACTION_SETTINGS);//系统设置界面 + mContext.startActivity(intent); + } + }) + .show(); + } + }); + } + + diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpUrl.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpUrl.java index ce2b604..430e9e3 100644 --- a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpUrl.java +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/http/HttpUrl.java @@ -12,6 +12,8 @@ public class HttpUrl { } public static String loginUrl = GetDomain()+"/user/access_token";//登录 + public static String schoolUrl = GetDomain()+"/school/get";//学校 + public static String gradesUrl = GetDomain()+"/grades";//年级 public static String provinceUrl = GetDomain()+"/ozing/provinces";//省 public static String cityUrl = GetDomain()+"/ozing/cities";//市 public static String countyUrl = GetDomain()+"/ozing/counties";//区县 diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/model/GradeInfo.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/model/GradeInfo.java new file mode 100644 index 0000000..fc2d0b3 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/model/GradeInfo.java @@ -0,0 +1,78 @@ +package com.hjx.personalcenter.model; + +import java.util.List; + +public class GradeInfo { + + private List data; + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public static class DataBean { + /** + * name : 小学 + * id : 1 + * children : [{"name":"一年级","id":2},{"name":"二年级","id":3},{"name":"三年级","id":4},{"name":"四年级","id":5},{"name":"五年级","id":6},{"name":"小学六年级","id":7}] + */ + + private String name; + private int id; + private List children; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public static class ChildrenBean { + /** + * name : 一年级 + * id : 2 + */ + + private String name; + private int id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + } + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/model/SchoolInfo.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/model/SchoolInfo.java new file mode 100644 index 0000000..b16bdfb --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/model/SchoolInfo.java @@ -0,0 +1,90 @@ +package com.hjx.personalcenter.model; + +import java.util.List; + +/** + * Created by h on 2017/8/21. + */ + +public class SchoolInfo { + + /** + * status : 1 + * pageSize : 0 + * data : [{"schoolName":"自强学校","schoolId":554606},{"schoolName":"石家庄十三中","schoolId":560171},{"schoolName":"石家庄五十中","schoolId":560172},{"schoolName":"石家庄二十二中","schoolId":561412},{"schoolName":"石家庄二十四中","schoolId":561413},{"schoolName":"石家庄四十五中","schoolId":561414},{"schoolName":"石家庄五十二中","schoolId":561415},{"schoolName":"石家庄五十三中","schoolId":561416},{"schoolName":"石家庄五十一中","schoolId":561417},{"schoolName":"国化工十二建公学校","schoolId":562347},{"schoolName":"建一局六公司子弟学校","schoolId":562540},{"schoolName":"石家庄八十二中(化肥厂学校)","schoolId":562966},{"schoolName":"固安一中","schoolId":605836},{"schoolName":"石家庄市二十一中","schoolId":647584}] + * msg : success + * pageNum : 0 + */ + + private int status; + private int pageSize; + private String msg; + private int pageNum; + private List data; + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public int getPageNum() { + return pageNum; + } + + public void setPageNum(int pageNum) { + this.pageNum = pageNum; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public static class DataBean { + /** + * schoolName : 自强学校 + * schoolId : 554606 + */ + + private String schoolName; + private int schoolId; + + public String getSchoolName() { + return schoolName; + } + + public void setSchoolName(String schoolName) { + this.schoolName = schoolName; + } + + public int getSchoolId() { + return schoolId; + } + + public void setSchoolId(int schoolId) { + this.schoolId = schoolId; + } + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/CropUtils.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/CropUtils.java new file mode 100644 index 0000000..d7baa33 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/CropUtils.java @@ -0,0 +1,148 @@ +package com.hjx.personalcenter.util; + +import android.annotation.SuppressLint; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.DocumentsContract; +import android.provider.MediaStore; +import android.util.Log; + +import static android.content.ContentValues.TAG; + +/** + * Created by yf on 2016/2/23. + */ +public class CropUtils { + @SuppressLint("NewApi") + 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]; + } + + } + // 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 = "_id=?"; + final String[] selectionArgs = new String[]{split[1]}; + + return getDataColumn(context, contentUri, selection, selectionArgs); + } + } + // MediaStore (and general) + else if ("content".equalsIgnoreCase(uri.getScheme())) { + return getDataColumn(context, uri, null, null); + } + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) { + return uri.getPath(); + } else { + String uriStr = uri.toString(); + String path = uriStr.substring(10, uriStr.length()); + if (path.startsWith("com.sec.android.gallery3d")) { + Log.e(TAG, "It's auto backup pic path:" + uri.toString()); + return null; + } + String[] filePathColumn = {MediaStore.Images.Media.DATA}; + Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null); + if (cursor != null) { + cursor.moveToFirst(); + } + int columnIndex = cursor.getColumnIndex(filePathColumn[0]); + String picturePath = cursor.getString(columnIndex); + cursor.close(); + return picturePath; + } + + return null; + } + + /** + * Get the value of the data column for this Uri. This is useful for + * MediaStore Uris, and other file-based ContentProviders. + * + * @param context The context. + * @param uri The Uri to query. + * @param selection (Optional) Filter used in the query. + * @param selectionArgs (Optional) Selection arguments used in the query. + * @return The value of the _data column, which is typically a file path. + */ + private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { + + Cursor cursor = null; + final String column = "_data"; + final String[] projection = {column}; + + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); + if (cursor != null && cursor.moveToFirst()) { + final int column_index = cursor.getColumnIndexOrThrow(column); + return cursor.getString(column_index); + } + } finally { + if (cursor != null) + cursor.close(); + } + return null; + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is ExternalStorageProvider. + */ + private static boolean isExternalStorageDocument(Uri uri) { + return "com.android.externalstorage.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is DownloadsProvider. + */ + private static boolean isDownloadsDocument(Uri uri) { + return "com.android.providers.downloads.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is MediaProvider. + */ + private static boolean isMediaDocument(Uri uri) { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/FileUtil.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/FileUtil.java new file mode 100644 index 0000000..b4d1f92 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/FileUtil.java @@ -0,0 +1,142 @@ +package com.hjx.personalcenter.util; + + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.OutputStream; + +/** + * Created by yf on 2016/7/22 0022. + * 文件的缓存与读取 + */ +public class FileUtil { + private static final String TAG = "FileUtil"; + + /** + * 获取缓存路径 + * + * @param context + * @return + */ + public static String getCachePath(Context context) { + String cachePath = null; + + if (Environment.MEDIA_MOUNTED.equals(Environment + .getExternalStorageState()) + || !Environment.isExternalStorageRemovable()) { + + cachePath = context.getExternalCacheDir().getPath(); + + } else { + cachePath = context.getCacheDir().getPath(); + } + return cachePath; + } + + /** + * 删除指定文件 + * + * @param file + * @return + */ + public static boolean deleteFile(File file) { + if (file.exists() && file.isFile()) { + return file.delete(); + } + return false; + } + + /** + * 递归删除文件和文件夹 + * + * @param file 要删除的根目录 + */ + public static void recursionDeleteFile(File file) { + if (file.isFile()) { + file.delete(); + return; + } + if (file.isDirectory()) { + File[] childFile = file.listFiles(); + if (childFile == null || childFile.length == 0) { + file.delete(); + return; + } + for (File f : childFile) { + recursionDeleteFile(f); + } + file.delete(); + } + } + + + /** + * 压缩图片方法,为了上传到服务器,保证图片大小在100k一下 + * + * @param context + * @param fileSrc + * @return + */ + public static File getSmallBitmap(Context context, String fileSrc) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(fileSrc, options); + options.inSampleSize = calculateInSampleSize(options, 480, 800); + Log.i(TAG, "options.inSampleSize-->" + options.inSampleSize); + options.inJustDecodeBounds = false; + Bitmap img = BitmapFactory.decodeFile(fileSrc, options); + Log.i(TAG, "file size after compress-->" + img.getByteCount() / 256); + String filename = context.getFilesDir() + File.separator + "video-" + img.hashCode() + ".jpg"; + saveBitmap2File(img, filename); + return new File(filename); + } + + /** + * 设置压缩的图片的大小设置的参数 + * + * @param options + * @param reqWidth + * @param reqHeight + * @return + */ + public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { + int height = options.outHeight; + int width = options.outWidth; + int inSampleSize = 1; + if (height > reqHeight || width > reqWidth) { + int heightRatio = Math.round(height) / reqHeight; + int widthRatio = Math.round(width) / reqWidth; + inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; + } + return inSampleSize; + } + + + /** + * 保存bitmap到文件 + * + * @param bmp + * @param filename + * @return + */ + public static boolean saveBitmap2File(Bitmap bmp, String filename) { + Bitmap.CompressFormat format = Bitmap.CompressFormat.JPEG; + int quality = 50;//压缩50% 100表示不压缩 + OutputStream stream = null; + try { + stream = new FileOutputStream(filename); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return bmp.compress(format, quality, stream); + } +} \ No newline at end of file diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/ImageCache.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/ImageCache.java new file mode 100644 index 0000000..d46c124 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/ImageCache.java @@ -0,0 +1,17 @@ + + +package com.hjx.personalcenter.util; + +import android.graphics.Bitmap; + +import java.util.WeakHashMap; + +public class ImageCache extends WeakHashMap { + + private static final long serialVersionUID = 1L; + + public boolean isCached(String url){ + return containsKey(url) && get(url) != null; + } + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PermissionUtil.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PermissionUtil.java new file mode 100644 index 0000000..2e464bf --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/PermissionUtil.java @@ -0,0 +1,116 @@ +package com.hjx.personalcenter.util; + +import android.Manifest; +import android.app.Activity; +import android.content.pm.PackageManager; +import android.os.Build; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v4.util.SimpleArrayMap; +import android.util.Log; + +/** + * Created by yf on 2016/7/22 0022. + */ +public class PermissionUtil { + public static final int REQUEST_SHOWCAMERA = 0; + public static final int REQUEST_READ_EXTERNAL_STORAGE = 1; + public static final int REQUEST_RECORD_AUDIO = 2; + public static final int REQUEST_CONTACTS = 3; + public static final int REQUEST_LOCATION = 4; + + + private static final SimpleArrayMap MIN_SDK_PERMISSIONS; + static { + MIN_SDK_PERMISSIONS = new SimpleArrayMap<>(8); + MIN_SDK_PERMISSIONS.put("com.android.voicemail.permission.ADD_VOICEMAIL", 14); + MIN_SDK_PERMISSIONS.put("android.permission.BODY_SENSORS", 20); + MIN_SDK_PERMISSIONS.put("android.permission.READ_CALL_LOG", 16); + MIN_SDK_PERMISSIONS.put("android.permission.READ_EXTERNAL_STORAGE", 16); + MIN_SDK_PERMISSIONS.put("android.permission.USE_SIP", 9); + MIN_SDK_PERMISSIONS.put("android.permission.WRITE_CALL_LOG", 16); + MIN_SDK_PERMISSIONS.put("android.permission.SYSTEM_ALERT_WINDOW", 23); + MIN_SDK_PERMISSIONS.put("android.permission.WRITE_SETTINGS", 23); + } + private static boolean permissionExists(String permission) { + Integer minVersion = MIN_SDK_PERMISSIONS.get(permission); + return minVersion == null || Build.VERSION.SDK_INT >= minVersion; + } + + public static boolean hasCameraPermission(Activity activity){ + int hasPermission = ContextCompat.checkSelfPermission(activity, + Manifest.permission.CAMERA); + if(!permissionExists(Manifest.permission.CAMERA)){ + Log.e("permission","your system does not suppport"+ Manifest.permission.CAMERA+" permission"); + return false; + } + if (hasPermission != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.CAMERA}, + PermissionUtil.REQUEST_SHOWCAMERA); + return false; + } + return true; + } + + public static boolean hasReadExternalStoragePermission(Activity activity){ + int hasPermission = ContextCompat.checkSelfPermission(activity, + Manifest.permission.READ_EXTERNAL_STORAGE); + if(!permissionExists(Manifest.permission.READ_EXTERNAL_STORAGE)){ + Log.e("permission","your system does not suppport "+ Manifest.permission.READ_EXTERNAL_STORAGE+" permission"); + return false; + } + if (hasPermission != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + PermissionUtil.REQUEST_READ_EXTERNAL_STORAGE); + return false; + } + return true; + } + public static boolean hasRecordAudioPermission(Activity activity){ + int hasPermission = ContextCompat.checkSelfPermission(activity, + Manifest.permission.RECORD_AUDIO); + if(!permissionExists(Manifest.permission.RECORD_AUDIO)){ + Log.e("permission","your system does not suppport"+ Manifest.permission.RECORD_AUDIO+" permission"); + return false; + } + if (hasPermission != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.RECORD_AUDIO}, + PermissionUtil.REQUEST_RECORD_AUDIO); + return false; + } + return true; + } + + public static boolean hasContactsPermission(Activity activity){ + int hasWPermission = ContextCompat.checkSelfPermission(activity, + Manifest.permission.WRITE_CONTACTS); + int hasRPermission = ContextCompat.checkSelfPermission(activity, + Manifest.permission.READ_CONTACTS); + + if(hasRPermission== PackageManager.PERMISSION_GRANTED && hasWPermission== PackageManager.PERMISSION_GRANTED){ + return true; + } + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_CONTACTS}, + PermissionUtil.REQUEST_CONTACTS); + return false; + } + public static boolean hasLocationPermission(Activity activity){ + int hasFPermission = ContextCompat.checkSelfPermission(activity, + Manifest.permission.ACCESS_FINE_LOCATION); + int hasCPermission = ContextCompat.checkSelfPermission(activity, + Manifest.permission.ACCESS_COARSE_LOCATION); + + if(hasFPermission== PackageManager.PERMISSION_GRANTED&&hasCPermission== PackageManager.PERMISSION_GRANTED){ + return true; + } + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, + PermissionUtil.REQUEST_LOCATION); + return false; + } + +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/SharedPreferenceMark.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/SharedPreferenceMark.java new file mode 100644 index 0000000..f6ba1f0 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/util/SharedPreferenceMark.java @@ -0,0 +1,56 @@ +package com.hjx.personalcenter.util; + +/** + * SharedPreference存储 记录只出现一次的组件是否已经出现过 + * Created by yf on 2016/7/25. + */ +public final class SharedPreferenceMark { + + + public static Boolean hasShowCamera=false;//是否已经提示过摄像头权限 + public static Boolean hasShowLocation=false;//是否已经提示过摄像头权限 + public static Boolean hasShowRecordAudio=false;//是否已经提示过摄像头权限 + public static Boolean hasShowExtralStoreage=false;//是否已经提示过摄像头权限 + public static Boolean hasShowContact=false;//是否已经提示过摄像头权限 + + + public static Boolean getHasShowCamera() { + return hasShowCamera; + } + + public static void setHasShowCamera(Boolean hasShowCamera) { + SharedPreferenceMark.hasShowCamera = hasShowCamera; + } + + public static Boolean getHasShowLocation() { + return hasShowLocation; + } + + public static void setHasShowLocation(Boolean hasShowLocation) { + SharedPreferenceMark.hasShowLocation = hasShowLocation; + } + + public static Boolean getHasShowRecordAudio() { + return hasShowRecordAudio; + } + + public static void setHasShowRecordAudio(Boolean hasShowRecordAudio) { + SharedPreferenceMark.hasShowRecordAudio = hasShowRecordAudio; + } + + public static Boolean getHasShowExtralStoreage() { + return hasShowExtralStoreage; + } + + public static void setHasShowExtralStoreage(Boolean hasShowExtralStoreage) { + SharedPreferenceMark.hasShowExtralStoreage = hasShowExtralStoreage; + } + + public static Boolean getHasShowContact() { + return hasShowContact; + } + + public static void setHasShowContact(Boolean hasShowContact) { + SharedPreferenceMark.hasShowContact = hasShowContact; + } +} diff --git a/PersonalCenter/app/src/main/java/com/hjx/personalcenter/widget/ClearEditText.java b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/widget/ClearEditText.java new file mode 100644 index 0000000..fca18c1 --- /dev/null +++ b/PersonalCenter/app/src/main/java/com/hjx/personalcenter/widget/ClearEditText.java @@ -0,0 +1,158 @@ +package com.hjx.personalcenter.widget; + +import android.content.Context; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.CycleInterpolator; +import android.view.animation.TranslateAnimation; +import android.widget.EditText; + +import com.hjx.personalcenter.R; + +/** + * 项目名称:EditSearch + * 类描述: + * 创建人:tonycheng + * 创建时间:2016/4/26 14:39 + * 邮箱:tonycheng93@outlook.com + * 修改人: + * 修改时间: + * 修改备注: + */ +public class ClearEditText extends EditText implements View.OnFocusChangeListener,TextWatcher { + /** + * 删除按钮的引用 + */ + private Drawable mClearDrawable; + private Context context; + + /** + * 控件是否有焦点 + */ + private boolean hasFocus; + + public ClearEditText(Context context) { + this(context,null); +// super(context); +// this.context = context; +// init(); + } + public ClearEditText(Context context, AttributeSet attrs){ + //这里构造方法也很重要,不加这个很多属性不能再XML里面定义 + this(context, attrs, android.R.attr.editTextStyle); + } + + public ClearEditText(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + private void init() { + //获取EditText的DrawableRight,假如没有设置我们就使用默认的图片 + mClearDrawable = getCompoundDrawables()[2]; + if (mClearDrawable == null) { + mClearDrawable = getResources().getDrawable(R.drawable.delete_selector); + } + mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight()); + //默认设置隐藏图标 + setClearIconVisible(false); + //设置焦点改变的监听 + setOnFocusChangeListener(this); + //设置输入框里面内容发生改变的监听 + addTextChangedListener(this); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + + if (mClearDrawable != null && event.getAction() == MotionEvent.ACTION_UP) { + int x = (int) event.getX(); + //判断触摸点是否在水平范围内 + boolean isInnerWidth = (x > (getWidth() - getTotalPaddingRight())) && + (x < (getWidth() - getPaddingRight())); + //获取删除图标的边界,返回一个Rect对象 + Rect rect = mClearDrawable.getBounds(); + //获取删除图标的高度 + int height = rect.height(); + int y = (int) event.getY(); + //计算图标底部到控件底部的距离 + int distance = (getHeight() - height) / 2; + //判断触摸点是否在竖直范围内(可能会有点误差) + //触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标 + boolean isInnerHeight = (y > distance) && (y < (distance + height)); + if (isInnerHeight && isInnerWidth) { + this.setText(""); + } + } + return super.onTouchEvent(event); + } + + /** + * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去 + * + * @param visible + */ + private void setClearIconVisible(boolean visible) { + Drawable right = visible ? mClearDrawable : null; + setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], + right, getCompoundDrawables()[3]); + } + + /** + * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏 + */ + @Override + public void onFocusChange(View v, boolean hasFocus) { + this.hasFocus = hasFocus; + if (hasFocus) { + setClearIconVisible(getText().length() > 0); + } else { + setClearIconVisible(false); + } + } + + /** + * 当输入框里面内容发生变化的时候回调的方法 + */ + @Override + public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { + if (hasFocus) { + setClearIconVisible(text.length() > 0); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void afterTextChanged(Editable s) { + + } + + /** + * 设置晃动动画 + */ + public void setShakeAnimation() { + this.setAnimation(shakeAnimation(5)); + } + + /** + * 晃动动画 + * + * @param counts 1秒钟晃动多少下 + * @return + */ + public static Animation shakeAnimation(int counts) { + Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0); + translateAnimation.setInterpolator(new CycleInterpolator(counts)); + translateAnimation.setDuration(1000); + return translateAnimation; + } +} diff --git a/PersonalCenter/app/src/main/res/drawable/delete_selector.xml b/PersonalCenter/app/src/main/res/drawable/delete_selector.xml new file mode 100644 index 0000000..4289f5c --- /dev/null +++ b/PersonalCenter/app/src/main/res/drawable/delete_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/PersonalCenter/app/src/main/res/drawable/search_clear_normal.png b/PersonalCenter/app/src/main/res/drawable/search_clear_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..8466f024f48bc34dd6dbd7614eeb5e77da9cd319 GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TG$pJnguK)l4KZpUAELnmfM!vw@ zc#e-i>l90Z{DK+m+fSbP!@$5<^yfrssZYvYSGHoiJ<3;u`CTy!}xvbO%o!`cuDo`iFLZ~3F-zh$Lc z2+r;mo-_G~*^@6Fj(sarTJr#=z^0Kw*-t+vH z|5S#&qM~C{>O$Nf{Hc@Xe$y;<`^Vqs1(NYQcb(k3>$OF7qZl*4Nc4+<9fgfa?A|M@ zzfX-35zYws;k9w1kMiUvE-$_m3dz53`E)5G@|N$5J%-<;r?(#3Brsj|yZ!ahh$~+H zuC2enO}w*Te#PHfSu_2~zus&8+jWAWKU7-ee5ml%O`Weog$ucr+H`*~)pe-cw2hAA Q2l}1C)78&qol`;+04wa|ApigX literal 0 HcmV?d00001 diff --git a/PersonalCenter/app/src/main/res/drawable/search_clear_pressed.png b/PersonalCenter/app/src/main/res/drawable/search_clear_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e45ded96ce033c03f59b8dbf1e2248c30fb2dc32 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGu>n3Iu1jbMay4eL04d(q@$(<(y3xwbyd1S);*>EaloalZHRYq2H; z9)<_4jcbhbKhL`M+dhp+$!GH|dE4K8?q+5UrhZD6-j#kwILj6W^=7{aDcl<~@#t5f z)dylb7MTALFkdfO*K_8jEdQfC6a6!*b+kWauJX#9=W17+8?5TE*}{}zY3=IgOV(~T zZM8DzTDA4-^9wuuf29?!_IQoc62V|!~&bkXnP$dAjyiZZo)j)xo7?hp7{EyLID`NzC#Kbz!( tosrFtwni?pidz)*_WGGM3QF+@&A9|+u4b+Ca{zjo!PC{xWt~$(69A!*$i@Hw literal 0 HcmV?d00001 diff --git a/PersonalCenter/app/src/main/res/layout/activity_feedback.xml b/PersonalCenter/app/src/main/res/layout/activity_feedback.xml index beb03bc..4a1c968 100644 --- a/PersonalCenter/app/src/main/res/layout/activity_feedback.xml +++ b/PersonalCenter/app/src/main/res/layout/activity_feedback.xml @@ -1,6 +1,8 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PersonalCenter/app/src/main/res/layout/custom_adilog_school_list_items.xml b/PersonalCenter/app/src/main/res/layout/custom_adilog_school_list_items.xml new file mode 100644 index 0000000..6823e64 --- /dev/null +++ b/PersonalCenter/app/src/main/res/layout/custom_adilog_school_list_items.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file