package com.forfan.bigbang.copy; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.BottomSheetBehavior; import android.support.design.widget.BottomSheetDialog; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; import com.forfan.bigbang.R; import com.forfan.bigbang.component.activity.BigBangActivity; import com.forfan.bigbang.component.base.BaseActivity; import com.forfan.bigbang.util.ArcTipViewController; import com.forfan.bigbang.util.ToastUtil; import com.forfan.bigbang.util.UrlCountUtil; import com.forfan.bigbang.util.ViewUtil; import com.shang.commonjar.contentProvider.SPHelper; import com.shang.utils.StatusBarCompat; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; import java.util.List; import static com.forfan.bigbang.util.ConstantUtil.IS_FULL_SCREEN_COPY; public class CopyActivity extends BaseActivity { private FrameLayout copyNodeViewContainer; private FloatingActionButton copyFab; private FloatingActionButton exitFab; private FloatingActionButton exitFullScreenFab; private Menu menu; private List<CopyNodeView> selectedNodes; private OnCopyNodeViewClickCallback mOnCopyNodeViewClickCallback; private int actionBarHeight = 0; private BottomSheetDialog bottomSheetDialog; private boolean actionModeDestroying = false; private boolean isFullScreen = false; private void addCopyNodeView(CopyNode copyNode, int height) { (new CopyNodeView(this, copyNode, mOnCopyNodeViewClickCallback)).addToFrameLayout(copyNodeViewContainer, height); } private void adjustActionBar(boolean showTitle, boolean hadSelection) { menu.setGroupVisible(R.id.copy_actions, hadSelection); if(isFullScreen) { if(hadSelection) { exitFab.show(); copyFab.show(); exitFullScreenFab.show(); } else { exitFab.show(); copyFab.hide(); exitFullScreenFab.show(); } } ActionBar actionBar = getSupportActionBar(); if(actionBar != null) { if(showTitle) { actionBar.setTitle(R.string.copy_title); actionBar.setSubtitle(R.string.copy_subtitle); actionBar.setHomeAsUpIndicator(R.mipmap.ic_close_white_24dp); return; } actionBar.setTitle((CharSequence)null); actionBar.setSubtitle((CharSequence)null); actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp); } } private void setSelectTextToClipboard(TextView textView) { // ClipboardUtils.setText(this,getSelectedTextViewText(var1)); Intent intent=new Intent(this, BigBangActivity.class); intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(BigBangActivity.TO_SPLIT_STR, getSelectedTextViewText(textView)); startActivity(intent); } private String getSelectedTextViewText(TextView textView) { if(textView == null) { return getSelectedText(); } else { CharSequence text = textView.getText(); if(textView.getSelectionStart() == textView.getSelectionEnd()) { return text.toString(); } else { CharSequence selected = text.subSequence(textView.getSelectionStart(), textView.getSelectionEnd()); return selected != null?selected.toString():text.toString(); } } } private void fullScreenMode(boolean fullScreen) { ActionBar actionBar = getSupportActionBar(); isFullScreen = fullScreen; if(fullScreen) { if(actionBar != null) { actionBar.hide(); } adjustActionBarWrap(); } else { if(actionBar != null) { actionBar.show(); } copyFab.hide(); exitFab.hide(); exitFullScreenFab.hide(); } SPHelper.save(IS_FULL_SCREEN_COPY,fullScreen); } private void showSelectedText() { actionModeDestroying = false; adjustActionBar(false, false); bottomSheetDialog = new BottomSheetDialog(this){ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); StatusBarCompat.setTranslucentStatus(getWindow(),true); } }; View view = getLayoutInflater().inflate(R.layout.dialog_copy_text_editor, null); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); view.setLayoutParams(layoutParams); TextView textView = (TextView)view.findViewById(R.id.text); textView.setText(getSelectedText()); // textView.setText(new SpannableString(getSelectedText()), TextView.BufferType.NORMAL); textView.setCustomSelectionActionModeCallback(new MySelectionActionModeCallback(textView)); view.findViewById(R.id.fab_copy).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setSelectTextToClipboard(null); bottomSheetDialog.dismiss(); finish(); } }); bottomSheetDialog.setContentView(view); ((View)view.getParent()).setBackgroundColor(getResources().getColor(android.R.color.transparent)); BottomSheetBehavior behavior = BottomSheetBehavior.from((View)view.getParent()); bottomSheetDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { behavior.setState(BottomSheetBehavior.STATE_EXPANDED); } }); bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { adjustActionBarWrap(); } }); bottomSheetDialog.show(); } private void adjustActionBarWrap() { boolean showTitle = true; boolean hadSelection; if(selectedNodes.size() > 0) { hadSelection = true; } else { hadSelection = false; } if(hadSelection) { showTitle = false; } adjustActionBar(showTitle, hadSelection); } private String getSelectedText() { StringBuilder text = new StringBuilder(); for(int i = 0; i < selectedNodes.size(); ++i) { text.append(((CopyNodeView)selectedNodes.get(i)).getText()); if(i + 1 < selectedNodes.size()) { text.append("\n"); } } return text.toString(); } private int getStatusBarHeight() { int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); return resId > 0?getResources().getDimensionPixelSize(resId):(int)Math.ceil((double)(25.0F * getResources().getDisplayMetrics().density)); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ArcTipViewController.getInstance().showHideFloatImageView(); setContentView(R.layout.activity_copy_overlay); Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); if(toolbar != null) { try { setSupportActionBar(toolbar); } catch (Throwable e) { e.printStackTrace(); } getSupportActionBar().setTitle(R.string.copy_title); getSupportActionBar().setSubtitle(R.string.copy_subtitle); getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_close_white_24dp); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } selectedNodes = new ArrayList(); mOnCopyNodeViewClickCallback = new OnCopyNodeViewClickCallback() { @Override public void onCopyNodeViewLongClick(CopyNodeView nodeView, boolean status) { if (status){ selectedNodes.add(nodeView); adjustActionBarWrap(); showSelectedText(); }else { selectedNodes.remove(nodeView); adjustActionBarWrap(); } } @Override public void onCopyNodeViewClick(CopyNodeView nodeView, boolean status) { if (status){ selectedNodes.add(nodeView); adjustActionBarWrap(); }else { selectedNodes.remove(nodeView); adjustActionBarWrap(); } } }; copyFab = (FloatingActionButton)findViewById(R.id.fab_copy_main); copyFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_COPY_FAB); setSelectTextToClipboard(null); finish(); } }); exitFab = (FloatingActionButton)findViewById(R.id.exit_button); exitFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT_FAB); finish(); } }); exitFullScreenFab = (FloatingActionButton)findViewById(R.id.exit_full_screen_button); exitFullScreenFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT_FULLSCREEN_FAB); fullScreenMode(false); } }); // getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); int statusBarHeight = getStatusBarHeight(); int height = displayMetrics.heightPixels; copyNodeViewContainer = (FrameLayout)findViewById(R.id.overlay_root); TypedValue typedValue = new TypedValue(); if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize(typedValue.data, getResources().getDisplayMetrics()); } Bundle extras = getIntent().getExtras(); if (extras==null){ finish(); return; } extras.setClassLoader(CopyNode.class.getClassLoader()); String packageName = extras.getString("source_package"); height = statusBarHeight; if(packageName != null) { height = statusBarHeight; if("com.android.chrome".equals(packageName)) { height = (int) (actionBarHeight - statusBarHeight - ViewUtil.dp2px(7)); } } ArrayList nodesList = extras.getParcelableArrayList("copy_nodes"); if(nodesList != null && nodesList.size() > 0) { CopyNode[] nodes = (CopyNode[])nodesList.toArray(new CopyNode[0]); Arrays.sort(nodes, new CopyNodeComparator()); for(int i = 0; i < nodes.length; ++i) { addCopyNodeView(nodes[i], height); } } else { ToastUtil.show(R.string.error_in_copy); finish(); } exitFab.postDelayed(new Runnable() { @Override public void run() { fullScreenMode(SPHelper.getBoolean(IS_FULL_SCREEN_COPY,false)); } }, 10); } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.universal_copy, menu); this.menu = menu; return super.onCreateOptionsMenu(menu); } public boolean onOptionsItemSelected(MenuItem menuItem) { switch(menuItem.getItemId()) { case android.R.id.home: UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT); // TODO: 2016/11/19 if(selectedNodes.size() <= 0) { UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT); finish(); return true; } UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT_RETUN); Iterator iterator = selectedNodes.iterator(); while(iterator.hasNext()) { ((CopyNodeView)iterator.next()).setActiveState(false); } selectedNodes.clear(); adjustActionBarWrap(); return true; case R.id.action_full_screen: UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EXIT_FULLSCREEN_ACTION); fullScreenMode(true); return true; case R.id.action_select_mode: UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_EDIT); showSelectedText(); return true; case R.id.action_select_all: UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_SELECT_ALL); selectAll(); return true; case R.id.action_copy: UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_COPY_ACTION); setSelectTextToClipboard((TextView)null); finish(); return true; default: return false; } } private void selectAll(){ int length=copyNodeViewContainer.getChildCount(); int nodeLength=0; for (int i = 0; i < length; i++) { View view = copyNodeViewContainer.getChildAt(i); if (view instanceof CopyNodeView) { nodeLength++; } } if (selectedNodes.size()==nodeLength && nodeLength!=0){ selectedNodes.clear(); for (int i = 0; i < length; i++) { View view = copyNodeViewContainer.getChildAt(i); if (view instanceof CopyNodeView) { ((CopyNodeView) view).setActiveState(false); } } }else { for (int i = 0; i < length; i++) { View view = copyNodeViewContainer.getChildAt(i); if (view instanceof CopyNodeView) { ((CopyNodeView) view).setActiveState(true); if (!selectedNodes.contains(view)) { selectedNodes.add((CopyNodeView) view); } } } } adjustActionBarWrap(); } public interface OnCopyNodeViewClickCallback { void onCopyNodeViewLongClick(CopyNodeView nodeView, boolean status); void onCopyNodeViewClick(CopyNodeView nodeView, boolean status); } public class CopyNodeComparator implements Comparator<CopyNode> { public int compare(CopyNode o1, CopyNode o2) { long o1Size = o1.caculateSize(); long o2Size = o2.caculateSize(); return o1Size < o2Size?-1:(o1Size == o2Size?0:1); } } private class MySelectionActionModeCallback implements ActionMode.Callback { private TextView textView; private MySelectionActionModeCallback(TextView view) { textView = view; } public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) { switch(item.getItemId()) { case R.id.fab_copy: UrlCountUtil.onEvent(UrlCountUtil.CLICK_UNIVERSAL_COPY_COPY_FAB); setSelectTextToClipboard(textView); finish(); return true; default: return false; } } public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { return true; } public void onDestroyActionMode(ActionMode actionMode) { if(CopyActivity.this.bottomSheetDialog != null && !CopyActivity.this.actionModeDestroying) { CopyActivity.this.actionModeDestroying = true; try { CopyActivity.this.bottomSheetDialog.dismiss(); } catch (IllegalArgumentException e) { } } CopyActivity.this.actionModeDestroying = false; } public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { for(int i = 0; i < menu.size(); ++i) { menu.getItem(i).setVisible(false); } return false; } } }