package info.guardianproject.securereaderinterface;
import info.guardianproject.securereaderinterface.R;
import info.guardianproject.securereaderinterface.ui.ActionProviderShare;
import info.guardianproject.securereaderinterface.ui.LayoutFactoryWrapper;
import info.guardianproject.securereaderinterface.ui.UICallbacks;
import info.guardianproject.securereaderinterface.uiutil.ActivitySwitcher;
import info.guardianproject.securereaderinterface.uiutil.UIHelpers;
import info.guardianproject.securereaderinterface.views.LeftSideMenu;
import info.guardianproject.securereaderinterface.views.LeftSideMenu.LeftSideMenuListener;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.content.LocalBroadcastManager;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.tinymission.rss.Feed;
public class FragmentActivityWithMenu extends LockableActivity implements LeftSideMenuListener
{
private KillReceiver mKillReceiver;
private SetUiLanguageReceiver mSetUiLanguageReceiver;
private WipeReceiver mWipeReceiver;
private int mIdMenu;
private Menu mOptionsMenu;
private boolean mDisplayHomeAsUp = false;
/**
* The main menu that will host all content links.
*/
LeftSideMenu mLeftSideMenu;
int mDeferedCommand;
protected boolean mResumed;
private boolean mNeedToRecreate;
protected void setMenuIdentifier(int idMenu)
{
mIdMenu = idMenu;
}
protected boolean useLeftSideMenu()
{
return true;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.getWindow().setBackgroundDrawable(null);
mKillReceiver = new KillReceiver();
registerReceiver(mKillReceiver, new IntentFilter(App.EXIT_BROADCAST_ACTION), App.EXIT_BROADCAST_PERMISSION, null);
mSetUiLanguageReceiver = new SetUiLanguageReceiver();
registerReceiver(mSetUiLanguageReceiver, new IntentFilter(App.SET_UI_LANGUAGE_BROADCAST_ACTION), App.EXIT_BROADCAST_PERMISSION, null);
mWipeReceiver = new WipeReceiver();
registerReceiver(mWipeReceiver, new IntentFilter(App.WIPE_BROADCAST_ACTION), App.EXIT_BROADCAST_PERMISSION, null);
final ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
if (useLeftSideMenu())
{
mLeftSideMenu = new LeftSideMenu(this, actionBar, R.layout.left_side_menu);
mLeftSideMenu.setListener(this);
}
setDisplayHomeAsUp(false);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setHomeButtonEnabled(true);
}
public void setDisplayHomeAsUp(boolean displayHomeAsUp)
{
Drawable logo = null;
if (displayHomeAsUp)
{
logo = this.getResources().getDrawable(R.drawable.actionbar_logo_up).mutate();
TypedValue outValue = new TypedValue();
getTheme().resolveAttribute(R.attr.actionBarThemeBackground, outValue, true);
if (outValue.resourceId == R.drawable.actionbar_dark_background)
logo = this.getResources().getDrawable(R.drawable.actionbar_logo_up_read).mutate();
}
else
logo = this.getResources().getDrawable(R.drawable.actionbar_logo).mutate();
// UIHelpers.colorizeDrawable(this, logo);
getSupportActionBar().setLogo(logo);
mDisplayHomeAsUp = displayHomeAsUp;
if (mLeftSideMenu != null)
mLeftSideMenu.setDisplayMenuIndicator(!displayHomeAsUp);
}
public void setActionBarTitle(String title)
{
if (title != null)
{
if (getSupportActionBar().getCustomView() == null)
{
View titleView = getLayoutInflater().inflate(R.layout.actionbar_custom_title, null);
getSupportActionBar().setCustomView(titleView,
new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
getSupportActionBar().setDisplayShowCustomEnabled(true);
TextView tvTitle = (TextView) getSupportActionBar().getCustomView().findViewById(R.id.tvTitle);
tvTitle.setText(title);
}
else
{
getSupportActionBar().setDisplayShowCustomEnabled(false);
}
}
@Override
protected void onStart()
{
super.onStart();
LocalBroadcastManager.getInstance(this).registerReceiver(mMenuCommandReceiver, new IntentFilter("MenuCommand"));
if (mLeftSideMenu != null)
mLeftSideMenu.checkMenuCreated();
}
@Override
protected void onStop()
{
super.onStop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMenuCommandReceiver);
}
@Override
protected void onPause() {
super.onPause();
mResumed = false;
}
@SuppressLint("NewApi")
@Override
protected void onResume()
{
super.onResume();
mResumed = true;
if (mNeedToRecreate)
{
onUiLanguageChanged();
return;
}
if (Build.VERSION.SDK_INT >= 11)
invalidateOptionsMenu();
}
private final class KillReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
finish();
}
}
private final class SetUiLanguageReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
new Handler().post(new Runnable()
{
@Override
public void run()
{
onUiLanguageChanged();
}
});
}
}
private final class WipeReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
new Handler().post(new Runnable()
{
@Override
public void run()
{
onWipe();
}
});
}
}
/**
* Override this to react to a wipe!
*/
protected void onWipe()
{
}
@SuppressLint("NewApi")
protected void onUiLanguageChanged()
{
if (!mResumed)
{
mNeedToRecreate = true;
}
else
{
mNeedToRecreate = false;
Intent intentThis = getIntent();
Bundle b = new Bundle();
onSaveInstanceState(b);
intentThis.putExtra("savedInstance", b);
intentThis.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intentThis);
overridePendingTransition(0, 0);
}
}
@Override
protected void onDestroy()
{
super.onDestroy();
unregisterReceiver(mKillReceiver);
unregisterReceiver(mSetUiLanguageReceiver);
unregisterReceiver(mWipeReceiver);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
if (mIdMenu == 0)
return false;
mOptionsMenu = menu;
super.onCreateOptionsMenu(menu);
getSupportMenuInflater().inflate(mIdMenu, menu);
colorizeMenuItems();
return true;
}
private void colorizeMenuItems()
{
if (mOptionsMenu == null)
return;
for (int i = 0; i < mOptionsMenu.size(); i++)
{
MenuItem item = mOptionsMenu.getItem(i);
Drawable d = item.getIcon();
if (d != null)
{
d = d.getConstantState().newDrawable(getResources()).mutate();
UIHelpers.colorizeDrawable(this, d);
item.setIcon(d);
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
if (mDisplayHomeAsUp)
{
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
this.startActivity(intent);
this.overridePendingTransition(R.anim.slide_in_from_left, R.anim.slide_out_to_right);
return true;
}
if (mLeftSideMenu != null)
mLeftSideMenu.toggle();
return true;
case R.id.menu_panic:
{
Intent intent = new Intent(this, PanicActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
return true;
}
case R.id.menu_add_post:
{
Intent intent = new Intent(this, AddPostActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}
@Override
@SuppressLint("NewApi")
public void onMenuCreated(final View parent, final View menuRoot, final View menu)
{
// News
//
menu.findViewById(R.id.llNews).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_news_list);
}
});
menu.findViewById(R.id.btnAddFeed).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_feed_add);
}
});
// Reporter
//
if (App.UI_ENABLE_REPORTER)
{
menu.findViewById(R.id.llReporter).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_posts_list);
}
});
menu.findViewById(R.id.btnAddPost).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_post_add);
}
});
}
else
{
// Disable reporter functionality
menu.findViewById(R.id.llReporter).setVisibility(View.GONE);
menu.findViewById(R.id.llReporterSeparator).setVisibility(View.GONE);
menu.findViewById(R.id.btnAddPost).setVisibility(View.GONE);
menu.findViewById(R.id.btnAddPostSeparator).setVisibility(View.GONE);
}
// Chat
//
if (App.UI_ENABLE_CHAT)
{
menu.findViewById(R.id.llChat).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_chat);
}
});
}
else
{
// Disable chat functionality
menu.findViewById(R.id.llChat).setVisibility(View.GONE);
menu.findViewById(R.id.llChatSeparator).setVisibility(View.GONE);
}
// Help
//
menu.findViewById(R.id.llHelp).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_help);
}
});
// Connect
menu.findViewById(R.id.btnTorStatus).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_toggle_online, true);
onBeforeShow(); // update menu
}
});
// Receive share
menu.findViewById(R.id.llReceiveShare).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_receiveshare);
}
});
menu.findViewById(R.id.llShareApp).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_shareapp);
}
});
// Preferences
//
View btnSettings = menu.findViewById(R.id.llSettings);
btnSettings.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mMenuCommandReceiver.handleCommand(R.integer.command_settings);
}
});
performRotateTransition(parent, menuRoot);
}
@SuppressLint("NewApi")
protected void performRotateTransition(final View parent, final View content)
{
// Get bitmap from intent!!!
Bitmap bmp = App.getInstance().getTransitionBitmap();
if (bmp != null)
{
final ImageView snap = new ImageView(this);
snap.setImageBitmap(bmp);
((ViewGroup) parent).addView(snap);
if (Build.VERSION.SDK_INT >= 11)
{
content.setLayerType(View.LAYER_TYPE_HARDWARE, null);
snap.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
else
{
content.setDrawingCacheEnabled(true);
snap.setDrawingCacheEnabled(true);
}
content.setVisibility(View.INVISIBLE);
// Animate!!!
ActivitySwitcher.animationOut(snap, getWindowManager(), new ActivitySwitcher.AnimationFinishedListener()
{
@Override
public void onAnimationFinished()
{
ActivitySwitcher.animationIn(content, getWindowManager(), new ActivitySwitcher.AnimationFinishedListener()
{
@Override
public void onAnimationFinished()
{
content.post(new Runnable()
{
@Override
@SuppressLint("NewApi")
public void run()
{
((ViewGroup) parent).removeView(snap);
App.getInstance().putTransitionBitmap(null);
if (Build.VERSION.SDK_INT >= 11)
{
content.setLayerType(View.LAYER_TYPE_NONE, null);
}
else
{
content.setDrawingCacheEnabled(false);
}
content.setVisibility(View.VISIBLE);
content.clearAnimation();
onAfterResumeAnimation();
}
});
}
});
}
});
}
else
{
onAfterResumeAnimation();
}
}
protected void onAfterResumeAnimation()
{
// Override this to start doing stuff after the animation is complete
}
private class MenuViewHolder
{
public TextView tvTorStatus;
public ImageView ivTorStatus;
public TextView tvNumFeeds;
public TextView tvNumStories;
public TextView tvNumChats;
}
private MenuViewHolder mMenuViewHolder;
@Override
public void onBeforeShow()
{
View menuView = mLeftSideMenu.getMenuView();
if (menuView != null)
{
UpdateMenuTask task = new UpdateMenuTask();
task.execute((Void) null);
}
}
class UpdateMenuTask extends ThreadedTask<Void, Void, Void>
{
private boolean isUsingTor;
private boolean isOnline;
// private boolean isSignedIn;
private int numFeeds;
private int numPosts;
@Override
protected Void doInBackground(Void... values)
{
if (mMenuViewHolder == null)
{
mMenuViewHolder = new MenuViewHolder();
View menuView = mLeftSideMenu.getMenuView();
mMenuViewHolder.tvTorStatus = (TextView) menuView.findViewById(R.id.tvTorStatus);
mMenuViewHolder.ivTorStatus = (ImageView) menuView.findViewById(R.id.btnTorStatus);
mMenuViewHolder.tvNumFeeds = (TextView) menuView.findViewById(R.id.tvNumFeeds);
mMenuViewHolder.tvNumStories = (TextView) menuView.findViewById(R.id.tvNumStories);
mMenuViewHolder.tvNumChats = (TextView) menuView.findViewById(R.id.tvNumChats);
}
isUsingTor = App.getInstance().socialReader.useTor();
isOnline = App.getInstance().socialReader.isTorOnline();
// isSignedIn = App.getInstance().socialReporter.isSignedIn();
numFeeds = App.getInstance().socialReader.getSubscribedFeedsList().size();
numPosts = 0;
// if (isSignedIn)
numPosts = App.getInstance().socialReporter.getPosts().size();
return null;
}
@Override
protected void onPostExecute(Void result)
{
// Update TOR connection status
//
if (isOnline)
{
mMenuViewHolder.tvTorStatus.setText(R.string.menu_tor_connected);
mMenuViewHolder.ivTorStatus.setImageResource(R.drawable.ic_menu_tor_on);
}
else
{
mMenuViewHolder.tvTorStatus.setText(R.string.menu_tor_not_connected);
mMenuViewHolder.ivTorStatus.setImageResource(R.drawable.ic_menu_tor_off);
}
if (isUsingTor)
{
mMenuViewHolder.tvTorStatus.setVisibility(View.VISIBLE);
mMenuViewHolder.ivTorStatus.setVisibility(View.VISIBLE);
}
else
{
mMenuViewHolder.tvTorStatus.setVisibility(View.INVISIBLE);
mMenuViewHolder.ivTorStatus.setVisibility(View.INVISIBLE);
}
mMenuViewHolder.tvNumFeeds.setText(getString(R.string.menu_num_feeds, numFeeds));
mMenuViewHolder.tvNumStories.setText(getString(R.string.menu_num_stories, numPosts));
mMenuViewHolder.tvNumChats.setText(getString(R.string.menu_num_chats, 0));
}
}
private class MenuBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
int commandId = intent.getIntExtra("command", 0);
handleCommand(commandId);
}
public void handleCommand(int commandId)
{
handleCommand(commandId, false);
}
public void handleCommand(int commandId, boolean forceNow)
{
mDeferedCommand = commandId;
if (mLeftSideMenu != null && mLeftSideMenu.isOpen() && !forceNow)
{
mLeftSideMenu.hide();
}
else
{
doHandleCommand();
}
}
};
private final MenuBroadcastReceiver mMenuCommandReceiver = new MenuBroadcastReceiver();
private void doHandleCommand()
{
if (mDeferedCommand != 0)
{
int command = mDeferedCommand;
mDeferedCommand = 0;
onCommand(command, null);
}
}
@Override
public void onHide()
{
doHandleCommand(); // Handle command, if any
}
protected boolean onCommand(int command, Bundle commandParameters)
{
UICallbacks.handleCommand(this, command, null);
return true;
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (this.mLeftSideMenu != null)
mLeftSideMenu.onConfigurationChanged();
}
@Override
protected void onUnlockedActivityResult(int requestCode, int resultCode, Intent data)
{
super.onUnlockedActivityResult(requestCode, resultCode, data);
if (requestCode == UICallbacks.RequestCode.CREATE_CHAT_ACCOUNT.Value)
{
if (resultCode == RESULT_OK)
{
App.getSettings().setChatUsernamePasswordSet();
// Then redirect somewhere?
}
}
}
@Override
public Object getSystemService(String name)
{
if (LAYOUT_INFLATER_SERVICE.equals(name))
{
LayoutInflater mParent = (LayoutInflater) super.getSystemService(name);
LayoutInflater inflater = mParent.cloneInContext(mParent.getContext());
inflater.setFactory(new LayoutFactoryWrapper(this));
return inflater;
}
return super.getSystemService(name);
}
}