package org.softeg.slartus.forpdaplus; import android.app.Activity; import android.content.ClipDescription; import android.content.ClipboardManager; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.AsyncTask; import android.os.Handler; import android.text.InputType; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.softeg.slartus.forpdaplus.classes.FastBlur; import org.softeg.slartus.forpdaplus.common.AppLog; import org.softeg.slartus.forpdaplus.fragments.profile.ProfileFragment; import org.softeg.slartus.forpdaplus.listtemplates.QmsContactsBrickInfo; import org.softeg.slartus.forpdaplus.prefs.Preferences; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import de.hdodenhof.circleimageview.CircleImageView; public class ShortUserInfo { public Activity mActivity; public SharedPreferences prefs; public CircleImageView imgAvatar; public ImageView imgAvatarSquare, infoRefresh, userBackground, openLink; public TextView userNick, qmsMessages, loginButton, userRep; public RelativeLayout textWrapper; public Handler mHandler = new Handler(); public Client client; public boolean isSquare; public String avatarUrl = ""; private View view; public ShortUserInfo(Activity activity, View view) { prefs = App.getInstance().getPreferences(); client = Client.getInstance(); mActivity = activity; this.view = view; userNick = (TextView) findViewById(R.id.userNick); qmsMessages = (TextView) findViewById(R.id.qmsMessages); loginButton = (TextView) findViewById(R.id.loginButton); userRep = (TextView) findViewById(R.id.userRep); textWrapper = (RelativeLayout) findViewById(R.id.textWrapper); imgAvatar = (CircleImageView) findViewById(R.id.imgAvatar); imgAvatarSquare = (ImageView) findViewById(R.id.imgAvatarSquare); infoRefresh = (ImageView) findViewById(R.id.infoRefresh); openLink = (ImageView) findViewById(R.id.openLink); userBackground = (ImageView) findViewById(R.id.userBackground); isSquare = prefs.getBoolean("isSquareAvarars", false); openLink.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String url; url = readFromClipboard(getContext()); if (url == null) url = ""; new MaterialDialog.Builder(getContext()) .title(R.string.go_to_link) .input(getContext().getString(R.string.insert_link), isPdaLink(url) ? url : null, new MaterialDialog.InputCallback() { @Override public void onInput(MaterialDialog dialog, CharSequence input) { } }) .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE) .positiveText(R.string.open) .negativeText(R.string.cancel) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(MaterialDialog dialog, DialogAction which) { if (!IntentActivity.tryShowUrl((MainActivity) getContext(), ((MainActivity) getContext()).getHandler(), dialog.getInputEditText().getText() + "", false, false)) { Toast.makeText(getContext(), R.string.links_not_supported, Toast.LENGTH_SHORT).show(); } } }) .show(); } }); File imgFile = new File(prefs.getString("userInfoBg", "")); if (imgFile.exists()) { ImageLoader.getInstance().displayImage("file://"+imgFile.getPath(), userBackground); } client.checkLoginByCookies(); if (isOnline()) { if (client.getLogined()) { new updateAsyncTask().execute(); if (isSquare) { imgAvatarSquare.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ProfileFragment.showProfile(client.UserId, client.getUser()); } }); } else { imgAvatar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ProfileFragment.showProfile(client.UserId, client.getUser()); } }); } client.addOnUserChangedListener(new Client.OnUserChangedListener() { @Override public void onUserChanged(String user, Boolean success) { mHandler.post(new Runnable() { @Override public void run() { refreshQms(); } }); } }); client.addOnMailListener(new Client.OnMailListener() { @Override public void onMail(int count) { mHandler.post(new Runnable() { @Override public void run() { refreshQms(); } }); } }); } else { loginButton.setVisibility(View.VISIBLE); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LoginDialog.showDialog(getContext(), null); } }); } } else { loginButton.setText(R.string.check_connection); } infoRefresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isOnline() & client.getLogined()) { new updateAsyncTask().execute(); } } }); } private Context getContext() { return mActivity; } private View findViewById(int id) { return view.findViewById(id); } private void refreshQms() { int qmsCount = client.getQmsCount(); if (qmsCount != 0) { qmsMessages.setText(String.format(mActivity.getString(R.string.new_qms_messages), qmsCount)); } else { qmsMessages.setText(R.string.no_new_qms_messages); } } private class updateAsyncTask extends AsyncTask<String, Void, Void> { String reputation = ""; @Override protected Void doInBackground(String... urls) { try { Document doc = Jsoup.parse(client.performGet("http://4pda.ru/forum/index.php?showuser=" + client.UserId)); if (doc.select("div.user-box > div.photo > img").first() != null) { avatarUrl = doc.select("div.user-box > div.photo > img").first().attr("src"); } if (doc.select("div.statistic-box span[id*=\"ajaxrep\"]").first() != null) { reputation = doc.select("div.statistic-box span[id*=\"ajaxrep\"]").first().text(); } } catch (IOException e) { AppLog.e(getContext(), e); } return null; } @Override protected void onPostExecute(Void result) { if (avatarUrl.equals("") | reputation.equals("")) { loginButton.setText(R.string.unknown_error); qmsMessages.setVisibility(View.GONE); } else if (client.getLogined()) { qmsMessages.setVisibility(View.VISIBLE); loginButton.setVisibility(View.GONE); textWrapper.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { QmsContactsBrickInfo brickInfo = new QmsContactsBrickInfo(); MainActivity.addTab(brickInfo.getTitle(), brickInfo.getName(), brickInfo.createFragment()); //ListFragmentActivity.showListFragment(getContext(), QmsContactsBrickInfo.NAME, null); } }); userNick.setText(client.getUser()); userRep.setVisibility(View.VISIBLE); userRep.setText(getContext().getString(R.string.reputation) + ": " + reputation); refreshQms(); if (prefs.getBoolean("isUserBackground", false)) { File imgFile = new File(prefs.getString("userInfoBg", "")); if (imgFile.exists()) { ImageLoader.getInstance().displayImage("file:///"+imgFile.getPath(), userBackground); } } else { if (!avatarUrl.equals(prefs.getString("userAvatarUrl", "")) | prefs.getString("userInfoBg", "").equals("")) { ImageLoader.getInstance().loadImage(avatarUrl, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { userBackground.post(new Runnable() { @Override public void run() { if (loadedImage == null) return; if (loadedImage.getWidth() == 0 || loadedImage.getHeight() == 0) return; blur(loadedImage, userBackground, avatarUrl); prefs.edit().putString("userAvatarUrl", avatarUrl).apply(); } }); } }); } else { File imgFile = new File(prefs.getString("userInfoBg", "")); if (imgFile.exists()) { ImageLoader.getInstance().displayImage("file:///"+imgFile.getPath(), userBackground); } } } ImageLoader.getInstance().displayImage(avatarUrl, isSquare ? imgAvatarSquare : imgAvatar); prefs.edit() .putString("shortUserInfoRep", reputation) .apply(); //prefs.edit().putBoolean("isLoadShortUserInfo", true).apply(); //prefs.edit().putString("shortAvatarUrl", avatarUrl).apply(); } else { userRep.setVisibility(View.GONE); loginButton.setVisibility(View.VISIBLE); } } } public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); return netInfo != null && netInfo.isConnectedOrConnecting() && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected(); } private void blur(Bitmap bkg, ImageView view, String url) { bkg = Bitmap.createScaledBitmap(bkg, view.getWidth(), view.getHeight(), false); float scaleFactor = 3; int radius = 64; Bitmap overlay = Bitmap.createBitmap((int) (view.getWidth() / scaleFactor), (int) (view.getHeight() / scaleFactor), Bitmap.Config.RGB_565); Canvas canvas = new Canvas(overlay); canvas.translate(-view.getLeft() / scaleFactor, -view.getTop() / scaleFactor); canvas.scale(1 / scaleFactor, 1 / scaleFactor); Paint paint = new Paint(); paint.setFlags(Paint.FILTER_BITMAP_FLAG); canvas.drawBitmap(bkg, 0, 0, paint); overlay = FastBlur.doBlur(overlay, radius, true); view.setImageBitmap(overlay); storeImage(overlay, url); } private void storeImage(Bitmap image, String url) { File pictureFile = getOutputMediaFile(url); if (pictureFile == null) { Log.d("kek", "Error creating media file, check storage permissions: ");// e.getMessage()); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); image.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.close(); } catch (FileNotFoundException e) { Log.d("kek", "File not found: " + e.getMessage()); } catch (IOException e) { Log.d("kek", "Error accessing file: " + e.getMessage()); } } private File getOutputMediaFile(String url) { // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. File mediaStorageDir = new File(Preferences.System.getSystemDir()); // This location works best if you want the created images to be shared // between applications and persist after your app has been uninstalled. // Create the storage directory if it does not exist if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { return null; } } // Create a media file name Long tsLong = System.currentTimeMillis() / 1000; String name = tsLong.toString(); Matcher m = Pattern.compile("http:\\/\\/s.4pda.to\\/(.*?)\\.").matcher(url); if (m.find()) { name = m.group(1); } String file = mediaStorageDir.getPath() + File.separator + name + ".png"; prefs.edit().putString("userInfoBg", file).apply(); return new File(file); } private boolean isPdaLink(String url) { if (Pattern.compile("4pda.ru/([^/$?&]+)", Pattern.CASE_INSENSITIVE).matcher(url).find()) return true; return false; } public static String readFromClipboard(Context context) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); if (clipboard.hasPrimaryClip()) { android.content.ClipDescription description = clipboard.getPrimaryClipDescription(); android.content.ClipData data = clipboard.getPrimaryClip(); if (data != null && description != null && description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) return String.valueOf(data.getItemAt(0).getText()); } return null; } }