package info.guardianproject.securereaderinterface.views; import info.guardianproject.securereaderinterface.App; import info.guardianproject.securereaderinterface.adapters.DownloadsAdapter; import info.guardianproject.securereaderinterface.adapters.ShareSpinnerAdapter; import info.guardianproject.securereaderinterface.adapters.TextSizeSpinnerAdapter; import info.guardianproject.securereaderinterface.models.PagedViewContent; import info.guardianproject.securereaderinterface.models.ViewPagerIndicator; import info.guardianproject.securereaderinterface.ui.UICallbacks; import info.guardianproject.securereaderinterface.widgets.CheckableImageView; import info.guardianproject.securereaderinterface.widgets.PagedView; import info.guardianproject.securereaderinterface.widgets.PagedView.PagedViewListener; import info.guardianproject.securereaderinterface.R; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import org.holoeverywhere.widget.AdapterView; import org.holoeverywhere.widget.Spinner; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Bundle; import android.util.Log; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import com.tinymission.rss.Item; public class FullScreenStoryItemView extends FrameLayout implements PagedViewListener { protected static final String LOGTAG = "FullScreenStoryItemView"; private View mBtnRead; private View mBtnComments; private CheckableImageView mBtnFavorite; private View mCurrentPageIndicator; private ShareSpinnerAdapter mShareAdapter; private TextSizeSpinnerAdapter mTextSizeAdapter; private PagedView mHorizontalPagerContent; private ArrayList<Item> mItems; private int mCurrentIndex; public FullScreenStoryItemView(Context context) { super(context); LayoutInflater inflater = LayoutInflater.from(context); inflater.inflate(R.layout.story_item, this); initialize(); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); return true; } @Override protected void onConfigurationChanged(Configuration newConfig) { this.removeAllViews(); super.onConfigurationChanged(newConfig); LayoutInflater inflater = LayoutInflater.from(getContext()); inflater.inflate(R.layout.story_item, this); PagedView oldPagedViewIfAny = mHorizontalPagerContent; initialize(); if (oldPagedViewIfAny != null) { this.mHorizontalPagerContent.setContentPrevious(oldPagedViewIfAny.getContentPrevious()); this.mHorizontalPagerContent.setContentThis(oldPagedViewIfAny.getContentThis()); this.mHorizontalPagerContent.setContentNext(oldPagedViewIfAny.getContentNext()); } setCurrentStoryIndex(mCurrentIndex); refresh(); } private void initialize() { mCurrentPageIndicator = findViewById(R.id.contentPageIndicator); mHorizontalPagerContent = (PagedView) findViewById(R.id.horizontalPagerContent); mHorizontalPagerContent.setViewPagerIndicator((ViewPagerIndicator)mCurrentPageIndicator); mHorizontalPagerContent.setListener(this); View toolbar = findViewById(R.id.storyToolbar); // Read story // mBtnRead = toolbar.findViewById(R.id.btnRead); mBtnRead.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showContent(); } }); // Read comments // mBtnComments = toolbar.findViewById(R.id.btnComments); mBtnComments.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showComments(); } }); // Disable comments? if (!App.UI_ENABLE_COMMENTS) { mBtnRead.setVisibility(View.GONE); mBtnComments.setVisibility(View.GONE); // toolbar.findViewById(R.id.separatorComments).setVisibility(View.GONE); } // Text Size // final Spinner spinnerTextSize = (Spinner) toolbar.findViewById(R.id.spinnerTextSize); mTextSizeAdapter = new TextSizeSpinnerAdapter(spinnerTextSize, getContext(), R.layout.text_size_story_item_button); spinnerTextSize.setAdapter(mTextSizeAdapter); spinnerTextSize.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { int adjustment = App.getSettings().getContentFontSizeAdjustment(); if (position == 0 && adjustment < 8) adjustment += 2; else if (position == 1 && adjustment > -8) adjustment -= 2; App.getSettings().setContentFontSizeAdjustment(adjustment); mHorizontalPagerContent.recreateAllViews(); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); // Favorite // mBtnFavorite = (CheckableImageView) toolbar.findViewById(R.id.chkFavorite); mBtnFavorite.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (getCurrentStory() != null) { CheckableImageView view = (CheckableImageView) v; view.toggle(); App.getInstance().socialReader.markItemAsFavorite(getCurrentStory(), view.isChecked()); UICallbacks.itemFavoriteStatusChanged(getCurrentStory()); } } }); // Share // Spinner spinnerShare = (Spinner) toolbar.findViewById(R.id.spinnerShare); mShareAdapter = new ShareSpinnerAdapter(spinnerShare, getContext(), R.string.story_item_share_popup_title, R.layout.share_story_item_button); spinnerShare.setAdapter(mShareAdapter); spinnerShare.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { ShareSpinnerAdapter adapter = (ShareSpinnerAdapter) parent.getAdapter(); Intent shareIntent = adapter.getIntentAtPosition(position); if (adapter.isSecureChatIntent(shareIntent)) shareIntent = App.getInstance().socialReader.getSecureShareIntent(getCurrentStory(), false); if (shareIntent != null) { /* if (!App.getSettings().chatUsernamePasswordSet() && App.getInstance().socialReader.ssettings.getChatSecureUsername() != null && App.getInstance().socialReader.ssettings.getChatSecurePassword() != null) { */ /* ima://foo:pass@bar.com/ action = android.intent.action.INSERT */ /* Intent usernamePasswordIntent = new Intent(Intent.ACTION_INSERT, Uri.parse("ima://"+App.getInstance().socialReader.ssettings.getChatSecureUsername()+":" +App.getInstance().socialReader.ssettings.getChatSecurePassword()+"@dukgo.com/")); */ /* * Possible Example: * if (context instanceof FragmentActivityWithMenu) * ((FragmentActivityWithMenu) context).startActivityForResultAsInternal(intent, -1); * else * context.startActivity(intent); */ //((Activity)getContext()).startActivityForResult(usernamePasswordIntent, UICallbacks.RequestCode.CREATE_CHAT_ACCOUNT); //getContext().startActivity(usernamePasswordIntent); // How to tell if it worked? //((Activity)context).startActivityForResult(usernamePasswordIntent,REGISTER_CHAT_USERNAME_PASSWORD); // if it is OK then App.getSettings().setChatUsernamePasswordSet(); /* } else if (App.getInstance().socialReader.ssettings.getChatSecureUsername() == null || App.getInstance().socialReader.ssettings.getChatSecurePassword() == null) { // Register Social Reporter username/password } else { */ getContext().startActivity(shareIntent); /*}*/ } } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); // Default to show story content showContent(); } public Item getCurrentStory() { if (mItems == null || mCurrentIndex < 0 || mCurrentIndex >= mItems.size()) return null; return mItems.get(mCurrentIndex); } public void setStory(ArrayList<Item> items, int currentIndex, SparseArray<Rect> initialViewPositions) { mItems = items; setCurrentStoryIndex(currentIndex); mHorizontalPagerContent.setContentPrevious(createStoryItemPageView(currentIndex - 1)); StoryItemView contentThis = createStoryItemPageView(currentIndex); if (initialViewPositions != null) contentThis.setStoredPositions(initialViewPositions); mHorizontalPagerContent.setContentThis(contentThis); mHorizontalPagerContent.setContentNext(createStoryItemPageView(currentIndex + 1)); refresh(); } private void setCurrentStoryIndex(int index) { mCurrentIndex = index; updateNumberOfComments(); mBtnFavorite.setChecked(getCurrentStory().getFavorite()); mShareAdapter.clear(); Intent shareIntent = App.getInstance().socialReader.getShareIntent(getCurrentStory()); mShareAdapter.addSecureBTShareResolver(shareIntent); mShareAdapter.addSecureChatShareResolver(App.getInstance().socialReader.getSecureShareIntent(getCurrentStory(), true)); // mShareAdapter.addIntentResolvers(App.getInstance().socialReader.getSecureShareIntent(getCurrentStory()), // PackageHelper.URI_CHATSECURE, // R.string.share_via_secure_chat, R.drawable.ic_share_sharer); mShareAdapter.addIntentResolvers(shareIntent); Item current = getCurrentStory(); if (current != null) DownloadsAdapter.viewed(current.getDatabaseId()); } private StoryItemView createStoryItemPageView(int index) { if (index < 0 || index >= mItems.size()) return null; Item item = mItems.get(index); StoryItemView content = new StoryItemView(item); return content; } public void refresh() { mHorizontalPagerContent.updateViews(0); } private void showContent() { mBtnRead.setSelected(true); mBtnComments.setSelected(false); mHorizontalPagerContent.setVisibility(View.VISIBLE); mCurrentPageIndicator.setVisibility(View.VISIBLE); } private void showComments() { Item currentStory = getCurrentStory(); if (currentStory != null) { String roomName = "story_" + MD5_Hash(currentStory.getGuid()); Bundle params = new Bundle(); params.putString("room_name", roomName); Log.v(LOGTAG, "Show comments, so start the chat application now with room: " + roomName); UICallbacks.handleCommand(getContext(), R.integer.command_chat, params); } // mBtnRead.setSelected(false); // mBtnComments.setSelected(true); // mHorizontalPagerContent.setVisibility(View.GONE); // mCurrentPageIndicator.setVisibility(View.GONE); } public static String MD5_Hash(String s) { MessageDigest m = null; try { m = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } m.update(s.getBytes(), 0, s.length()); String hash = new BigInteger(1, m.digest()).toString(16); return hash; } public void showFavoriteButton(boolean bShow) { if (!bShow) this.mBtnFavorite.setVisibility(View.GONE); else this.mBtnFavorite.setVisibility(View.VISIBLE); } private void updateNumberOfComments() { // if (mBtnComments != null) // { // int numberOfComments = 0; // if (getCurrentStory() != null) // numberOfComments = getCurrentStory().getNumberOfComments(); // ((TextView) // mBtnComments.findViewById(R.id.tvNumComments)).setText(String.valueOf(numberOfComments)); // } } @Override public PagedViewContent onMovedToPrevious() { if (mCurrentIndex > 0) { setCurrentStoryIndex(mCurrentIndex - 1); return createStoryItemPageView(mCurrentIndex - 1); } return null; } @Override public PagedViewContent onMovedToNext() { if (mCurrentIndex < (mItems.size() - 1)) { setCurrentStoryIndex(mCurrentIndex + 1); return createStoryItemPageView(mCurrentIndex + 1); } return null; } public void onBeforeCollapse() { PagedViewContent content = mHorizontalPagerContent.getContentThis(); if (content != null && content instanceof StoryItemView) { StoryItemView siv = (StoryItemView) content; siv.resetToStoredPositions(ExpandingFrameLayout.DEFAULT_COLLAPSE_DURATION); } } }