/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.doplgangr.secrecy.Views;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import com.balysv.materialmenu.MaterialMenuDrawable;
import com.balysv.materialmenu.extras.abc.MaterialMenuIconCompat;
import com.doplgangr.secrecy.Config;
import com.doplgangr.secrecy.CustomApp;
import com.doplgangr.secrecy.FileSystem.storage;
import com.doplgangr.secrecy.Premium.PremiumFragment_;
import com.doplgangr.secrecy.R;
import com.doplgangr.secrecy.Settings.Prefs_;
import com.doplgangr.secrecy.Settings.SettingsFragment_;
import com.doplgangr.secrecy.UpdateManager.AppVersion_;
import com.doplgangr.secrecy.UpdateManager.UpdateManager_;
import com.doplgangr.secrecy.Util;
import com.doplgangr.secrecy.Views.DummyViews.NavDrawer.DrawerLayout;
import com.doplgangr.secrecy.Views.DummyViews.NavDrawer.NavItem;
import com.doplgangr.secrecy.Views.DummyViews.NavDrawer.NavListView;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.sharedpreferences.Pref;
import java.util.ArrayList;
@EActivity(R.layout.activity_main)
public class MainActivity
extends ActionBarActivity
implements
VaultsListFragment.OnVaultSelectedListener,
VaultsListFragment.OnFragmentFinishListener {
private final Context context = this;
@Pref
AppVersion_ version;
@Pref
Prefs_ Prefs;
@ViewById(R.id.left_drawer_list)
NavListView mNavigation;
@ViewById(R.id.left_drawer)
View mDrawer;
@ViewById(R.id.drawer_layout)
DrawerLayout mDrawerLayout;
FragmentManager fragmentManager;
MaterialMenuIconCompat materialMenu;
@AfterViews
public void onCreate() {
storage.deleteTemp(); //Start clean
fragmentManager = getSupportFragmentManager();
switchFragment(0);
if (Prefs.stealthMode().get() == -1) {
//if this is the first time, display a dialog to inform successful trial
onFirstLaunch();
return;
}
PackageInfo pInfo;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
Util.log("Cannot get package info, abort.");
return;
}
if (pInfo != null) {
if (pInfo.versionCode != version.no().get())
addFragment(new UpdateManager_(), R.anim.slide_in_right, R.anim.fadeout);
}
materialMenu = new MaterialMenuIconCompat(this, Color.WHITE, MaterialMenuDrawable.Stroke.THIN);
materialMenu.animateState(MaterialMenuDrawable.IconState.BURGER);
mNavigation.addNavigationItem(
CustomApp.context.getString(R.string.Page_header__vaults),
R.drawable.ic_vault,
false);
mNavigation.addNavigationItem(
CustomApp.context.getString(R.string.Page_header__settings),
R.drawable.ic_setting,
false);
mNavigation.addNavigationItem(
CustomApp.context.getString(R.string.action__donate),
R.drawable.ic_love,
false);
mNavigation.addNavigationItem(
CustomApp.context.getString(R.string.action__support),
R.drawable.ic_help,
false);
mNavigation.setNavigationItemClickListener(new NavListView.NavigationItemClickListener() {
@Override
public void onNavigationItemSelected(String item, ArrayList<NavItem> items, int position) {
Util.log(position, "Clicked");
switchFragment(position);
mDrawerLayout.closeDrawers();
}
});
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_launcher, 0, 0) {
/**
* Called when a drawer has settled in a completely closed state.
*/
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
materialMenu.animateState(MaterialMenuDrawable.IconState.BURGER);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
/**
* Called when a drawer has settled in a completely open state.
*/
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
materialMenu.animateState(MaterialMenuDrawable.IconState.X);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
showHelpDeskTutorial();
}
private void showHelpDeskTutorial() {
if (Prefs.showHelpDeskTutorial().get())
Util.alert(this,
getString(R.string.Dialog__help_centre_tutorial),
getString(R.string.Dialog__help_centre_tutorial_message),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
support();
Prefs.showHelpDeskTutorial()
.put(false);
}
},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//do nothing
Prefs.showHelpDeskTutorial()
.put(false);
}
}
);
}
void switchFragment(int page) {
switch (page) {
case 0:
addFragment(new VaultsListFragment_(), 0, 0);
break;
case 1:
addFragment(new SettingsFragment_(), 0, 0);
break;
case 2:
addFragment(new PremiumFragment_(), 0, 0);
break;
case 3:
support();
return; //Do not set highlighted
}
mNavigation.setSelectedItem(page);
}
void onFirstLaunch() {
final View dialogView = View.inflate(context, R.layout.dialog_finish_stealth, null);
String password = Prefs.OpenPIN().get();
((TextView) dialogView
.findViewById(R.id.stealth_keycode))
.append(password);
new AlertDialog.Builder(context)
.setInverseBackgroundForced(true)
.setMessage(getString(R.string.Stealth__finish))
.setView(dialogView)
.setPositiveButton(getString(R.string.OK),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Prefs.stealthMode().put(1);
onCreate();
}
}
)
.show();
}
@OptionsItem(R.id.home)
void supporthomePressed() {
if (mDrawerLayout.isDrawerOpen(mDrawer)) {
mDrawerLayout.closeDrawer(mDrawer);
} else {
mDrawerLayout.openDrawer(mDrawer);
}
}
@OptionsItem(android.R.id.home)
void homePressed() {
if (mDrawerLayout.isDrawerOpen(mDrawer)) {
mDrawerLayout.closeDrawer(mDrawer);
}else {
mDrawerLayout.openDrawer(mDrawer);
}
}
@Override
public void onVaultSelected(String vault, String password) {
Intent intent = new Intent(this, FilesActivity_.class);
intent.putExtra(Config.vault_extra, vault);
intent.putExtra(Config.password_extra, password);
startActivity(intent);
}
void addFragment(final Fragment fragment, int transition1, int transition2) {
String tag = fragment.getClass().getName();
fragmentManager.beginTransaction()
.setCustomAnimations(transition1, transition2)
.replace(R.id.content_frame, fragment, tag)
.addToBackStack(tag)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
}
void support() {
Util.openURI(Config.support_website); //launch uservoice portal
}
@Override
public void onFinish(Fragment fragment) {
fragmentManager.beginTransaction()
.remove(fragment)
.commit();
}
@Override
public void onNew(Bundle bundle, Fragment fragment) {
fragment.setArguments(bundle);
addFragment(fragment, R.anim.slide_in_right, R.anim.fadeout);
}
@Override
public void onDestroy() {
storage.deleteTemp(); //Cleanup every time
super.onDestroy();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen =
mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mDrawer);
hideMenuItems(menu, !drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
private void hideMenuItems(Menu menu, boolean visible){
for(int i = 0; i < menu.size(); i++)
menu.getItem(i).setVisible(visible);
}
}