/*
* 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.activities;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import com.doplgangr.secrecy.Config;
import com.doplgangr.secrecy.CustomApp;
import com.doplgangr.secrecy.R;
import com.doplgangr.secrecy.fragments.AboutFragment;
import com.doplgangr.secrecy.utils.Util;
import com.doplgangr.secrecy.filesystem.Storage;
import com.doplgangr.secrecy.filesystem.encryption.VaultHolder;
import com.doplgangr.secrecy.fragments.PremiumFragment;
import com.doplgangr.secrecy.fragments.SettingsFragment;
import com.doplgangr.secrecy.fragments.UpdateManager;
import com.doplgangr.secrecy.adapters.VaultsListFragment;
import com.doplgangr.secrecy.views.navdrawer.DrawerLayout;
import com.doplgangr.secrecy.views.navdrawer.NavItem;
import com.doplgangr.secrecy.views.navdrawer.NavListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends ActionBarActivity implements
VaultsListFragment.OnVaultSelectedListener,
VaultsListFragment.OnFragmentFinishListener {
private final List<Class> mFragmentNameList = new ArrayList<Class>() {{
add(VaultsListFragment.class);
add(SettingsFragment.class);
add(PremiumFragment.class);
add(AboutFragment.class);
}};
private final Context context = this;
private NavListView mNavigation;
private View mDrawer;
private DrawerLayout mDrawerLayout;
private Toolbar mToolbar;
private FragmentManager fragmentManager;
private ActionBarDrawerToggle mDrawerToggle;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
int versionNumber = PreferenceManager.getDefaultSharedPreferences(context)
.getInt(Config.APP_VERSION_NUMBER, 1);
mNavigation = (NavListView) findViewById(R.id.left_drawer_list);
mDrawer = findViewById(R.id.left_drawer);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
Storage.deleteTemp(); //Start clean
VaultHolder.getInstance().clear();
fragmentManager = getFragmentManager();
switchFragment(0);
setSupportActionBar(mToolbar);
if (PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean(Config.SHOW_STEALTH_MODE_TUTORIAL, false)) {
onFirstLaunch();
}
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 != versionNumber)
addFragment(new UpdateManager(), android.R.animator.fade_in, android.R.animator.fade_out);
}
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__about),
R.drawable.ic_about,
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();
}
});
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
mToolbar, 0, 0) {
/**
* Called when a drawer has settled in a completely closed state.
*/
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
/**
* Called when a drawer has settled in a completely open state.
*/
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerLayout.setDrawerListener(mDrawerToggle);
Util.loadSelectedImageSize(PreferenceManager.getDefaultSharedPreferences(context)
.getString(Config.IMAGE_SIZE, Config.IMAGE_SIZE_DEFAULT));
showHelpDeskTutorial();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if (mDrawerToggle != null)
mDrawerToggle.syncState();
}
private void showHelpDeskTutorial() {
if (PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean("showHelpDeskTutorial", true)) {
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();
}
},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}
);
SharedPreferences.Editor editor
= PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putBoolean("showHelpDeskTutorial", false);
editor.apply();
}
}
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:
addFragment(new AboutFragment(), 0, 0);
break;
case 4:
support();
break;
}
}
void onFirstLaunch() {
final View dialogView = View.inflate(context, R.layout.dialog_finish_stealth, null);
String password = PreferenceManager.getDefaultSharedPreferences(context)
.getString(Config.STEALTH_MODE_PASSWORD, "");
((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) {
SharedPreferences.Editor editor
= PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putBoolean(Config.SHOW_STEALTH_MODE_TUTORIAL, false);
editor.apply();
}
}
)
.show();
}
@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) {
if (mFragmentNameList.contains(fragment.getClass())) {
mNavigation.setSelectedItem(mFragmentNameList.indexOf(fragment.getClass()));
}
String tag = fragment.getClass().getName();
if (fragmentManager.getBackStackEntryCount() >= 1) {
String activeFragmentTag = fragmentManager
.getBackStackEntryAt(fragmentManager
.getBackStackEntryCount() - 1).getName();
Fragment activeFragment = fragmentManager
.findFragmentByTag(activeFragmentTag);
// Don't switch fragment if already active
if (activeFragment.getClass().equals(fragment.getClass())){
return;
}
//clear all except lowest
FragmentManager.BackStackEntry first = fragmentManager.getBackStackEntryAt(0);
fragmentManager.popBackStackImmediate(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
FragmentTransaction transaction = fragmentManager.beginTransaction()
.setCustomAnimations(transition1, transition2)
.replace(R.id.content_frame, fragment, tag);
if (fragment.getClass() != VaultsListFragment.class) {
transaction = transaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(tag);
}
transaction.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, android.R.animator.fade_in, android.R.animator.fade_out);
}
@Override
public void onDestroy() {
Storage.deleteTemp(); //Cleanup every time
VaultHolder.getInstance().clear();
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);
}
}