package com.gh.gamecenter; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.provider.MediaStore; import android.support.v4.content.ContextCompat; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.View; import android.view.Window; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.ScrollView; import android.widget.TextView; import com.gh.base.AppController; import com.gh.base.BaseActivity; import com.gh.base.OnRequestCallBackListener; import com.gh.common.constant.Config; import com.gh.common.util.BitmapUtils; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.DialogUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.LoginUtils; import com.gh.common.util.PackageUtils; import com.gh.common.util.PatternUtils; import com.gh.common.util.SoftInputHidWidgetUtils; import com.gh.gamecenter.entity.InstallGameEntity; import com.gh.gamecenter.entity.SuggestionTypeEntity; import com.gh.gamecenter.entity.UserInfoEntity; import com.gh.gamecenter.fragment.WaitingDialogFragment; import com.gh.gamecenter.retrofit.JSONObjectResponse; import com.gh.gamecenter.retrofit.RetrofitManager; import com.gh.gamecenter.suggest.SuggestPicAdapter; import com.gh.gamecenter.suggest.SuggestSelectGameAdapter; import com.gh.gamecenter.suggest.SuggestTypeAdapter; import com.google.gson.Gson; import com.lightgame.download.FileUtils; import com.lightgame.utils.Util_System_Keyboard; import com.lightgame.utils.Util_System_Phone_State; import com.lightgame.utils.Utils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.OnClick; import okhttp3.MediaType; import okhttp3.RequestBody; import retrofit2.HttpException; import rx.Observable; import rx.Observer; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by khy on 2017/3/31. */ public class SuggestionActivity extends BaseActivity implements SuggestTypeAdapter.OnSelectTypeListener, OnRequestCallBackListener { @BindView(R.id.suggest_content_et) EditText mSuggestContentEt; @BindView(R.id.suggest_pic_rv) RecyclerView mSuggestPicRv; @BindView(R.id.suggest_news_link_et) EditText mSuggestNewsLinkEt; @BindView(R.id.suggest_news_link_ll) View mSuggestNewsLinkLl; @BindView(R.id.suggest_email_et) EditText mSuggestEmailEt; @BindView(R.id.suggest_post_btn) TextView mSuggestPostBtn; @BindView(R.id.suggest_post_ll) View suggestPostLl; @BindView(R.id.suggest_type_rv) RecyclerView mTypeRv; @BindView(R.id.suggest_select_game) TextView mSuggestSelectGame; @BindView(R.id.suggest_game_text) TextView mSuggestGameText; @BindView(R.id.suggest_game_ll) View mSuggestGameLl; @BindView(R.id.suggest_scrollview) ScrollView mScrollView; private SuggestPicAdapter mAdapter; private Dialog selectGameDialog; private WaitingDialogFragment postDialog; private String[] arrType = {"普通反馈", "功能建议", "发生闪退", "游戏问题", "游戏收录", "文章投稿"}; private int curType = -1; private SharedPreferences sp; public static void startSuggestionActivity(Context context, int suggestType, String suggestHintType, String content) { Intent intent = new Intent(context, SuggestionActivity.class); intent.putExtra("suggestType", suggestType); intent.putExtra("suggestHintType", suggestHintType); intent.putExtra("content", content); context.startActivity(intent); } @Override protected int getLayoutId() { return R.layout.activity_suggest; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (data != null && requestCode == 0x233) { Uri selectedImage = data.getData(); if (selectedImage == null) { return; } String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); if (cursor == null) { return; } cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); Utils.log("picturePath = " + picturePath); File file = new File(picturePath); if (file.length() > 8 * 1024 * 1024) { toast("图片大小不能超过8M"); } else { mAdapter.addFileList(picturePath); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initTitle(getString(R.string.title_suggestion)); curType = getIntent().getExtras().getInt("suggestType"); String suggestContent = getIntent().getExtras().getString("content"); String suggestHintType = getIntent().getExtras().getString("suggestHintType"); if (getIntent().getBundleExtra("data") != null) { Bundle data = getIntent().getBundleExtra("data"); suggestContent = data.getString("content"); suggestHintType = data.getString("suggestHintType"); curType = data.getInt("suggestType"); } sp = PreferenceManager.getDefaultSharedPreferences(this); // 意见反馈类型 mTypeRv.setLayoutManager(new GridLayoutManager(this, 2) { @Override public boolean canScrollVertically() { return false; } }); ((DefaultItemAnimator) mTypeRv.getItemAnimator()).setSupportsChangeAnimations(false); mTypeRv.setAdapter(new SuggestTypeAdapter(this, curType, arrType)); // 意见反馈上传图片列表 mSuggestPicRv.setLayoutManager(new GridLayoutManager(this, 5) { @Override public boolean canScrollVertically() { return false; } }); mAdapter = new SuggestPicAdapter(this); mSuggestPicRv.setAdapter(mAdapter); SoftInputHidWidgetUtils.assistActivity(this); if (!TextUtils.isEmpty(suggestContent)) { mSuggestContentEt.setText(suggestContent); } initSuggest(curType); if (curType == 5 && !TextUtils.isEmpty(suggestContent)) { mSuggestGameLl.setVisibility(View.GONE); mSuggestContentEt.setVisibility(View.VISIBLE); } String suggestionType = sp.getString("SuggestionType", null); if (!TextUtils.isEmpty(suggestHintType) && !TextUtils.isEmpty(suggestionType)) { Gson gson = new Gson(); SuggestionTypeEntity typeEntity = gson.fromJson(suggestionType, SuggestionTypeEntity.class); if (typeEntity != null) { switch (suggestHintType) { case "plugin": List plugin = typeEntity.getPlugin(); if (plugin != null && plugin.size() > 0) { showHintDialog(plugin); } break; case "game": List game = typeEntity.getGame(); if (game != null && game.size() > 0) { showHintDialog(game); } break; case "libao": List libao = typeEntity.getLibao(); if (libao != null && libao.size() > 0) { showHintDialog(libao); } break; case "service": List service = typeEntity.getService(); if (service != null && service.size() > 0) { showHintDialog(service); } break; } } } UserInfoEntity userInfo = LoginUtils.getUserInfo(this); if (userInfo != null && !TextUtils.isEmpty(userInfo.getContact())) { mSuggestEmailEt.setText(userInfo.getContact()); } } private void initSuggest(int type) { switch (type) { case 1: mSuggestContentEt.setHint("请详细描述你遇到的问题... \n ↓↓你还可以上传截图"); mSuggestNewsLinkLl.setVisibility(View.GONE); mSuggestContentEt.setVisibility(View.VISIBLE); mSuggestGameLl.setVisibility(View.GONE); break; case 2: mSuggestContentEt.setHint("请详细描述你的建议... \n ↓↓你还可以上传截图"); mSuggestNewsLinkLl.setVisibility(View.GONE); mSuggestContentEt.setVisibility(View.VISIBLE); mSuggestGameLl.setVisibility(View.GONE); break; case 3: mSuggestContentEt.setHint("请详细描述闪退之前你所进行的操作... \n ↓↓你还可以上传截图"); mSuggestNewsLinkLl.setVisibility(View.GONE); mSuggestContentEt.setVisibility(View.VISIBLE); mSuggestGameLl.setVisibility(View.GONE); break; case 4: mSuggestContentEt.setHint("请写上游戏名字,以及具体遇到的问题... \n ↓↓你还可以上传截图"); mSuggestNewsLinkLl.setVisibility(View.GONE); mSuggestContentEt.setVisibility(View.VISIBLE); mSuggestGameLl.setVisibility(View.GONE); break; case 5: mSuggestNewsLinkLl.setVisibility(View.GONE); mSuggestGameLl.setVisibility(View.VISIBLE); mSuggestContentEt.setVisibility(View.INVISIBLE); mSuggestContentEt.setHint("你想收录哪个游戏或游戏版本... \n ↓↓你还可以上传截图"); mSuggestNewsLinkEt.setHint("填写链接(例如游戏的下载地址或介绍页面)"); mSuggestNewsLinkLl.setVisibility(View.VISIBLE); break; case 6: mSuggestContentEt.setHint("简单介绍文章内容,然后在下面填写文章链接 \n ↓↓你还可以上传截图"); mSuggestNewsLinkLl.setVisibility(View.VISIBLE); mSuggestContentEt.setVisibility(View.VISIBLE); mSuggestGameLl.setVisibility(View.GONE); mSuggestNewsLinkEt.setHint("填写文章链接"); break; } } private void showHintDialog(List dialogType) { final Dialog dialog = new Dialog(SuggestionActivity.this); LinearLayout container = new LinearLayout(SuggestionActivity.this); container.setOrientation(LinearLayout.VERTICAL); container.setBackgroundColor(Color.WHITE); container.setPadding(0, DisplayUtils.dip2px(SuggestionActivity.this, 12), 0, DisplayUtils.dip2px(SuggestionActivity.this, 12)); for (String s : dialogType) { final TextView reportTv = new TextView(SuggestionActivity.this); reportTv.setText(s); reportTv.setTextSize(17); reportTv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.title)); reportTv.setBackgroundResource(R.drawable.textview_white_style); int widthPixels = getResources().getDisplayMetrics().widthPixels; reportTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10, LinearLayout.LayoutParams.WRAP_CONTENT)); reportTv.setPadding(DisplayUtils.dip2px(SuggestionActivity.this, 20), DisplayUtils.dip2px(SuggestionActivity.this, 12), 0, DisplayUtils.dip2px(SuggestionActivity.this, 12)); container.addView(reportTv); reportTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.cancel(); mSuggestContentEt.setText(mSuggestContentEt.getText().toString() + reportTv.getText().toString()); } }); } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(container); dialog.show(); } @Override public void loadDone() { } @Override public void loadDone(InstallGameEntity entity) { if (selectGameDialog != null) { selectGameDialog.cancel(); } mSuggestGameLl.setVisibility(View.GONE); mSuggestContentEt.setVisibility(View.VISIBLE); mSuggestContentEt.setText("推荐收录:" + entity.getGameName() + "(" + entity.getPackageName() + ", " + entity.getGameVersion() + ")"); } @Override public void loadError() { } @Override public void loadEmpty() { } @OnClick({R.id.suggest_post_btn, R.id.suggest_select_game, R.id.suggest_game_text}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.suggest_post_btn: if (TextUtils.isEmpty(mSuggestContentEt.getText().toString())) { return; } CheckLoginUtils.checkLogin(this, new CheckLoginUtils.OnLoggenInListener() { @Override public void onLoggedIn() { String email = mSuggestEmailEt.getText().toString().trim(); String url = mSuggestNewsLinkEt.getText().toString().trim(); if (!TextUtils.isEmpty(url) && !PatternUtils.isUrlAddress(url)) { Utils.toast(SuggestionActivity.this, "请输入正确的链接"); return; } if (TextUtils.isEmpty(email)) { showConfirmDialog(email); } else { postDialog = WaitingDialogFragment.newInstance(getString(R.string.dialog_feedback_doing)); postDialog.show(getSupportFragmentManager(), null); List fileList = mAdapter.getFileList(); if (fileList != null && fileList.size() > 0) { postPic(email); } else { initPostData(email, null); } } } }); break; case R.id.suggest_select_game: showSelectDialog(); break; case R.id.suggest_game_text: mSuggestGameLl.setVisibility(View.GONE); mSuggestContentEt.setVisibility(View.VISIBLE); break; } } // 弹出确认对话框 private void showConfirmDialog(final String email) { DialogUtils.showWarningDialog(this, "温馨提示", "填写联系方式有助于我们更好地一对一解决您的问题,确定不填写吗?", "直接提交", "我要填写", new DialogUtils.ConfirmListener() { @Override public void onConfirm() { mSuggestEmailEt.requestFocus(); mSuggestEmailEt.postDelayed(new Runnable() { @Override public void run() { Util_System_Keyboard.showSoftKeyboard(getApplicationContext(), mSuggestEmailEt); } }, 300); } }, new DialogUtils.CancelListener() { @Override public void onCancel() { postDialog = WaitingDialogFragment.newInstance(getString(R.string.dialog_feedback_doing)); postDialog.show(getSupportFragmentManager(), null); List fileList = mAdapter.getFileList(); if (fileList != null && fileList.size() > 0) { postPic(email); } else { initPostData(email, null); } } }); } private void postPic(final String email) { final JSONArray picArray = new JSONArray(); Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { String path; int index = 0; for (String s : mAdapter.getFileList()) { path = getCacheDir() + File.separator + System.currentTimeMillis() + index + ".jpg"; if (BitmapUtils.savePicture(path, s)) { subscriber.onNext(FileUtils.uploadFile(Config.API_HOST + "support/upload/img?type=suggestion", path, LoginUtils.getToken(SuggestionActivity.this))); index++; } else { subscriber.onNext(FileUtils.uploadFile(Config.API_HOST + "support/upload/img?type=suggestion", s, LoginUtils.getToken(SuggestionActivity.this))); } } subscriber.onCompleted(); } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override public void onCompleted() { Utils.log("=========完成"); initPostData(email, picArray); } @Override public void onError(Throwable e) { if (postDialog != null) { postDialog.dismissAllowingStateLoss(); } Utils.toast(SuggestionActivity.this, "上传失败"); Utils.log("=========上传失败" + e.toString()); } @Override public void onNext(JSONObject result) { if (result != null) { try { Utils.log("===========" + result); int statusCode = result.getInt("statusCode"); if (statusCode == HttpURLConnection.HTTP_OK) { picArray.put(result.getString("img")); } } catch (Exception e) { e.printStackTrace(); } } } }); } private void initPostData(String email, JSONArray picArray) { Map params = new HashMap<>(); params.put("message", mSuggestContentEt.getText().toString().trim()); params.put("from", email); params.put("ghversion", PackageUtils.getVersionName(this)); params.put("channel", AppController.getInstance().getChannel()); params.put("type", android.os.Build.MODEL); params.put("sdk", String.valueOf(android.os.Build.VERSION.SDK_INT)); params.put("version", android.os.Build.VERSION.RELEASE); params.put("source", "光环助手"); params.put("imei", Util_System_Phone_State.getDeviceId(this)); if ((curType == 6 || curType == 5) && !TextUtils.isEmpty(mSuggestNewsLinkEt.getText().toString())) { params.put("url", mSuggestNewsLinkEt.getText().toString().trim()); } if (curType > 0) { params.put("suggestion_type", arrType[curType - 1]); } if (curType == 3) { params.put("log", readFromFile()); } JSONObject jsonObject = new JSONObject(params); if (picArray != null && picArray.length() > 0) { try { jsonObject.put("pic", picArray); } catch (JSONException e) { e.printStackTrace(); } } RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()); sendSuggestion(body); } private void sendSuggestion(final RequestBody body) { RetrofitManager.getApi().postSuggestion(body, LoginUtils.getToken(this)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { if (postDialog != null) { postDialog.dismissAllowingStateLoss(); } if (response.length() != 0) { try { if ("ok".equals(response.getString("status"))) { toast("感谢您的反馈!"); setResult(0x122); finish(); } else { toast("提交失败,请稍后尝试!"); } } catch (JSONException e) { e.printStackTrace(); } } else { toast("提交失败,请稍后尝试!"); } } @Override public void onFailure(HttpException e) { try { if (e != null) { String string = e.response().errorBody().string(); } } catch (IOException e1) { e1.printStackTrace(); } if (postDialog != null) { postDialog.dismissAllowingStateLoss(); } toast("提交失败,请检查网络状态"); } }); } private void showSelectDialog() { View view = View.inflate(this, R.layout.dialog_suggest_select_game, null); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.dialog_suggest_game_rv); TextView back = (TextView) view.findViewById(R.id.dialog_suggest_game_back); ProgressBar pb = (ProgressBar) view.findViewById(R.id.dialog_suggest_game_load); recyclerView.setLayoutManager(new GridLayoutManager(this, 4)); recyclerView.setAdapter(new SuggestSelectGameAdapter(this, pb)); selectGameDialog = new Dialog(this); selectGameDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); selectGameDialog.setCanceledOnTouchOutside(false); selectGameDialog.setContentView(view); selectGameDialog.show(); back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectGameDialog.cancel(); } }); } @Override public void onType(int type) { curType = type; mSuggestPicRv.postDelayed(new Runnable() { @Override public void run() { //将ScrollView滚动到底 mScrollView.fullScroll(View.FOCUS_DOWN); } }, 100); initSuggest(type); } public String readFromFile() { if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { File file = new File(getExternalFilesDir(null).getPath() + "/log"); if (file.isFile()) return "检测log文件夹是文件"; File[] files = file.listFiles(); if (files == null || files.length == 0) return "log文件夹为空" + file.getPath(); File targetFile = files[files.length - 1]; try { if (!targetFile.exists()) { targetFile.createNewFile(); return "No File error "; } else { InputStream in = new BufferedInputStream(new FileInputStream(targetFile)); BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); String tmp; StringBuffer string = new StringBuffer(); while ((tmp = br.readLine()) != null) { string.append(tmp); } br.close(); in.close(); return string.toString(); } } catch (Exception e) { return e.toString(); } } else { return "SD Card error"; } } }