Files
FairEmail/app/src/main/java/eu/faircode/email/ActivityView.java

409 lines
15 KiB
Java
Raw Normal View History

2018-08-02 13:33:06 +00:00
package eu.faircode.email;
/*
This file is part of Safe email.
Safe email is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
NetGuard is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with NetGuard. If not, see <http://www.gnu.org/licenses/>.
Copyright 2018 by Marcel Bokhorst (M66B)
*/
import android.arch.lifecycle.Observer;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Configuration;
2018-08-06 17:04:24 +00:00
import android.net.Uri;
2018-08-02 13:33:06 +00:00
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
2018-08-02 17:07:02 +00:00
import android.util.Log;
2018-08-02 13:33:06 +00:00
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
2018-08-02 13:33:06 +00:00
import android.widget.ListView;
import android.widget.TextView;
import java.text.Collator;
import java.util.Collections;
import java.util.Comparator;
2018-08-02 13:33:06 +00:00
import java.util.List;
import java.util.Locale;
2018-08-02 13:33:06 +00:00
public class ActivityView extends ActivityBase implements FragmentManager.OnBackStackChangedListener, SharedPreferences.OnSharedPreferenceChangeListener {
2018-08-05 11:40:15 +00:00
private boolean newIntent = false;
2018-08-02 13:33:06 +00:00
private DrawerLayout drawerLayout;
private ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
static final int LOADER_ACCOUNT_PUT = 1;
static final int LOADER_IDENTITY_PUT = 2;
static final int LOADER_FOLDER_PUT = 3;
static final int LOADER_MESSAGES_INIT = 4;
2018-08-05 15:42:02 +00:00
static final int LOADER_MESSAGE_MOVE = 5;
2018-08-02 13:33:06 +00:00
static final int REQUEST_VIEW = 1;
static final String ACTION_VIEW_MESSAGES = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGES";
static final String ACTION_VIEW_MESSAGE = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGE";
static final String ACTION_EDIT_FOLDER = BuildConfig.APPLICATION_ID + ".EDIT_FOLDER";
@Override
protected void onCreate(Bundle savedInstanceState) {
2018-08-05 11:40:15 +00:00
Log.i(Helper.TAG, "View create");
2018-08-02 13:33:06 +00:00
super.onCreate(savedInstanceState);
2018-08-02 13:33:06 +00:00
setContentView(R.layout.activity_view);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
drawerLayout = findViewById(R.id.drawer_layout);
drawerLayout.setScrimColor(Helper.resolveColor(this, R.attr.colorDrawerScrim));
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.app_name, R.string.app_name) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
getSupportActionBar().setTitle(getString(R.string.app_name));
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getSupportActionBar().setTitle(getString(R.string.app_name));
}
};
drawerLayout.addDrawerListener(drawerToggle);
drawerList = findViewById(R.id.drawer_list);
drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
DrawerItem item = (DrawerItem) parent.getAdapter().getItem(position);
switch (item.getId()) {
case -1:
onMenuFolders((long) item.getData());
2018-08-02 13:33:06 +00:00
break;
case R.string.menu_setup:
onMenuSetup();
break;
2018-08-06 17:04:24 +00:00
case R.string.menu_faq:
onMenuFAQ();
break;
case R.string.menu_about:
onMenuAbout();
2018-08-02 17:07:02 +00:00
break;
2018-08-02 13:33:06 +00:00
}
drawerLayout.closeDrawer(drawerList);
2018-08-02 13:33:06 +00:00
}
});
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
getSupportFragmentManager().addOnBackStackChangedListener(this);
DB.getInstance(this).account().liveAccounts().observe(this, new Observer<List<EntityAccount>>() {
@Override
public void onChanged(@Nullable List<EntityAccount> accounts) {
ArrayAdapterDrawer drawerArray = new ArrayAdapterDrawer(ActivityView.this, R.layout.item_drawer);
final Collator collator = Collator.getInstance(Locale.getDefault());
collator.setStrength(Collator.SECONDARY); // Case insensitive, process accents etc
Collections.sort(accounts, new Comparator<EntityAccount>() {
@Override
public int compare(EntityAccount a1, EntityAccount a2) {
return collator.compare(a1.name, a2.name);
}
});
for (EntityAccount account : accounts)
drawerArray.add(new DrawerItem(-1, R.drawable.baseline_folder_24, account.name, account.id));
drawerArray.add(new DrawerItem(ActivityView.this, R.drawable.baseline_settings_applications_24, R.string.menu_setup));
if (getIntentFAQ().resolveActivity(getPackageManager()) != null)
drawerArray.add(new DrawerItem(ActivityView.this, R.drawable.baseline_question_answer_24, R.string.menu_faq));
drawerArray.add(new DrawerItem(ActivityView.this, R.drawable.baseline_help_24, R.string.menu_about));
drawerList.setAdapter(drawerArray);
}
});
2018-08-02 13:33:06 +00:00
if (getSupportFragmentManager().getFragments().size() == 0)
init();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
2018-08-05 11:40:15 +00:00
Log.i(Helper.TAG, "View post create");
2018-08-02 13:33:06 +00:00
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
2018-08-06 19:56:10 +00:00
syncState();
}
private void syncState() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean eula = prefs.getBoolean("eula" , false);
2018-08-06 19:56:10 +00:00
int count = getSupportFragmentManager().getBackStackEntryCount();
drawerToggle.setDrawerIndicatorEnabled(count == 1 && eula);
2018-08-02 13:33:06 +00:00
}
@Override
protected void onResume() {
2018-08-05 11:40:15 +00:00
Log.i(Helper.TAG, "View resume");
2018-08-02 13:33:06 +00:00
super.onResume();
2018-08-05 11:40:15 +00:00
2018-08-02 13:33:06 +00:00
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
IntentFilter iff = new IntentFilter();
iff.addAction(ACTION_VIEW_MESSAGES);
iff.addAction(ACTION_VIEW_MESSAGE);
iff.addAction(ACTION_EDIT_FOLDER);
lbm.registerReceiver(receiver, iff);
2018-08-05 11:40:15 +00:00
if (newIntent) {
newIntent = false;
getSupportFragmentManager().popBackStack("unified" , 0);
2018-08-05 11:40:15 +00:00
}
2018-08-02 13:33:06 +00:00
}
@Override
protected void onPause() {
2018-08-05 11:40:15 +00:00
Log.i(Helper.TAG, "View pause");
2018-08-02 13:33:06 +00:00
super.onPause();
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
lbm.unregisterReceiver(receiver);
}
@Override
protected void onNewIntent(Intent intent) {
2018-08-05 11:40:15 +00:00
Log.i(Helper.TAG, "View new intent=" + intent);
newIntent = true;
super.onNewIntent(intent);
}
2018-08-02 13:33:06 +00:00
@Override
public void onConfigurationChanged(Configuration newConfig) {
2018-08-05 11:40:15 +00:00
Log.i(Helper.TAG, "View configuration changed");
2018-08-02 13:33:06 +00:00
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
2018-08-06 19:56:10 +00:00
syncState();
2018-08-02 13:33:06 +00:00
}
2018-08-05 11:40:15 +00:00
@Override
protected void onDestroy() {
Log.i(Helper.TAG, "View destroyed");
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
2018-08-02 13:33:06 +00:00
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(drawerList))
drawerLayout.closeDrawer(drawerList);
else
super.onBackPressed();
}
@Override
2018-08-05 11:40:15 +00:00
public void onBackStackChanged() {
2018-08-06 14:40:21 +00:00
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count == 0)
2018-08-05 11:40:15 +00:00
finish();
2018-08-06 19:56:10 +00:00
syncState();
2018-08-02 13:33:06 +00:00
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
2018-08-04 15:37:42 +00:00
super.onSharedPreferenceChanged(prefs, key);
2018-08-02 13:33:06 +00:00
if ("eula".equals(key))
init();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item))
return true;
switch (item.getItemId()) {
2018-08-06 14:40:21 +00:00
case android.R.id.home:
getSupportFragmentManager().popBackStack();
return true;
default:
return false;
}
2018-08-02 13:33:06 +00:00
}
private void init() {
invalidateOptionsMenu();
2018-08-04 16:54:57 +00:00
2018-08-02 13:33:06 +00:00
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.getBoolean("eula" , false)) {
2018-08-06 19:56:10 +00:00
getSupportFragmentManager().popBackStack(); // eula
2018-08-02 13:33:06 +00:00
Bundle args = new Bundle();
args.putLong("folder" , -1);
2018-08-03 09:58:44 +00:00
FragmentMessages fragment = new FragmentMessages();
2018-08-02 13:33:06 +00:00
fragment.setArguments(args);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("unified");
fragmentTransaction.commit();
DB.getInstance(this).account().liveAccounts(true).observe(this, new Observer<List<EntityAccount>>() {
@Override
public void onChanged(@Nullable List<EntityAccount> accounts) {
if (accounts.size() == 0)
startActivity(new Intent(ActivityView.this, ActivitySetup.class));
else
ServiceSynchronize.start(ActivityView.this);
}
});
} else {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
2018-08-06 19:56:10 +00:00
fragmentTransaction.replace(R.id.content_frame, new FragmentEula()).addToBackStack("eula");
2018-08-02 13:33:06 +00:00
fragmentTransaction.commit();
}
}
2018-08-06 17:04:24 +00:00
private Intent getIntentFAQ() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://github.com/M66B/open-source-email/blob/master/FAQ.md"));
return intent;
}
private void onMenuFolders(long account) {
getSupportFragmentManager().popBackStack("unified" , 0);
Bundle args = new Bundle();
args.putLong("account" , account);
FragmentFolders fragment = new FragmentFolders();
fragment.setArguments(args);
2018-08-02 13:33:06 +00:00
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("folders");
2018-08-02 13:33:06 +00:00
fragmentTransaction.commit();
}
private void onMenuSetup() {
startActivity(new Intent(ActivityView.this, ActivitySetup.class));
}
2018-08-06 17:04:24 +00:00
private void onMenuFAQ() {
startActivity(getIntentFAQ());
}
private void onMenuAbout() {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, new FragmentAbout()).addToBackStack("about");
fragmentTransaction.commit();
2018-08-02 17:07:02 +00:00
}
2018-08-02 13:33:06 +00:00
private class DrawerItem {
private int id;
private int icon;
2018-08-02 13:33:06 +00:00
private String title;
private Object data;
2018-08-02 13:33:06 +00:00
DrawerItem(Context context, int icon, int title) {
2018-08-02 13:33:06 +00:00
this.id = title;
this.icon = icon;
2018-08-02 13:33:06 +00:00
this.title = context.getString(title);
}
DrawerItem(int id, int icon, String title, Object data) {
this.id = id;
this.icon = icon;
this.title = title;
this.data = data;
2018-08-02 13:33:06 +00:00
}
public int getId() {
return this.id;
}
public Object getData() {
return this.data;
2018-08-02 13:33:06 +00:00
}
}
private static class ArrayAdapterDrawer extends ArrayAdapter<DrawerItem> {
private int resource;
ArrayAdapterDrawer(@NonNull Context context, int resource) {
super(context, resource);
this.resource = resource;
}
@NonNull
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
View row;
if (null == convertView)
row = LayoutInflater.from(getContext()).inflate(this.resource, null);
else
row = convertView;
DrawerItem item = getItem(position);
ImageView iv = row.findViewById(R.id.ivItem);
2018-08-02 13:33:06 +00:00
TextView tv = row.findViewById(R.id.tvItem);
iv.setImageResource(item.icon);
tv.setText(item.title);
2018-08-02 13:33:06 +00:00
return row;
}
}
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_VIEW_MESSAGES.equals(intent.getAction())) {
getSupportFragmentManager().popBackStack("unified" , 0);
2018-08-02 13:33:06 +00:00
FragmentMessages fragment = new FragmentMessages();
fragment.setArguments(intent.getExtras());
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("messages");
fragmentTransaction.commit();
} else if (ACTION_VIEW_MESSAGE.equals(intent.getAction())) {
FragmentMessage fragment = new FragmentMessage();
fragment.setArguments(intent.getExtras());
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("message");
fragmentTransaction.commit();
} else if (ACTION_EDIT_FOLDER.equals(intent.getAction())) {
FragmentFolder fragment = new FragmentFolder();
fragment.setArguments(intent.getExtras());
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("folder");
fragmentTransaction.commit();
}
}
};
}