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

1214 lines
49 KiB
Java
Raw Normal View History

2018-08-02 13:33:06 +00:00
package eu.faircode.email;
/*
2018-08-14 05:53:24 +00:00
This file is part of FairEmail.
2018-08-02 13:33:06 +00:00
2018-08-14 05:53:24 +00:00
FairEmail is free software: you can redistribute it and/or modify
2018-08-02 13:33:06 +00:00
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.
2018-10-29 10:46:49 +00:00
FairEmail is distributed in the hope that it will be useful,
2018-08-02 13:33:06 +00:00
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
2018-10-29 10:46:49 +00:00
along with FairEmail. If not, see <http://www.gnu.org/licenses/>.
2018-08-02 13:33:06 +00:00
2018-12-31 08:04:33 +00:00
Copyright 2018-2019 by Marcel Bokhorst (M66B)
2018-08-02 13:33:06 +00:00
*/
2019-08-13 10:27:17 +02:00
import android.annotation.SuppressLint;
2019-06-30 11:35:03 +02:00
import android.app.Dialog;
import android.app.NotificationManager;
import android.app.PendingIntent;
2018-08-02 13:33:06 +00:00
import android.content.BroadcastReceiver;
import android.content.Context;
2018-09-07 11:08:20 +00:00
import android.content.DialogInterface;
2018-08-02 13:33:06 +00:00
import android.content.Intent;
import android.content.IntentFilter;
2018-09-08 10:37:28 +00:00
import android.content.SharedPreferences;
2019-04-29 12:11:16 +02:00
import android.content.pm.PackageManager;
2018-08-02 13:33:06 +00:00
import android.content.res.Configuration;
2019-04-29 11:39:24 +02:00
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
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.os.Handler;
2019-08-01 08:38:15 +02:00
import android.text.TextUtils;
2018-08-02 13:33:06 +00:00
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
2019-08-16 16:35:33 +02:00
import android.widget.ImageButton;
import android.widget.ScrollView;
2018-08-09 20:45:42 +00:00
import android.widget.Toast;
2018-08-02 13:33:06 +00:00
2019-06-30 11:35:03 +02:00
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBarDrawerToggle;
2019-06-30 11:35:03 +02:00
import androidx.appcompat.app.AlertDialog;
import androidx.constraintlayout.widget.Group;
import androidx.core.app.NotificationCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Observer;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.PreferenceManager;
2019-04-29 11:39:24 +02:00
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
2018-09-08 09:41:05 +00:00
import org.json.JSONArray;
import org.json.JSONObject;
2018-08-11 04:41:26 +00:00
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
2018-11-13 16:01:29 +01:00
import java.io.IOException;
2018-11-10 15:50:08 +00:00
import java.io.InputStream;
2018-09-08 09:41:05 +00:00
import java.io.InputStreamReader;
import java.net.URL;
2018-08-13 18:31:42 +00:00
import java.util.ArrayList;
2018-08-07 18:31:14 +00:00
import java.util.Date;
2018-08-02 13:33:06 +00:00
import java.util.List;
2018-09-08 09:41:05 +00:00
import javax.net.ssl.HttpsURLConnection;
2018-08-11 04:41:26 +00:00
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
2018-09-04 18:51:09 +00:00
public class ActivityView extends ActivityBilling implements FragmentManager.OnBackStackChangedListener {
private String startup;
2018-08-25 11:27:54 +00:00
private View view;
private View content_separator;
private View content_pane;
private DrawerLayout drawerLayout;
2018-08-02 13:33:06 +00:00
private ActionBarDrawerToggle drawerToggle;
private ScrollView drawerContainer;
private RecyclerView rvAccount;
2019-09-01 18:59:51 +02:00
private ImageButton ibExpanderUnified;
2019-07-19 08:27:44 +02:00
private RecyclerView rvUnified;
private RecyclerView rvFolder;
private RecyclerView rvMenu;
2019-09-01 18:59:51 +02:00
private ImageButton ibExpanderExtra;
2019-04-29 11:39:24 +02:00
private RecyclerView rvMenuExtra;
2019-07-20 22:22:21 +02:00
private Group grpUnified;
2018-08-02 13:33:06 +00:00
2019-06-12 18:56:38 +02:00
private boolean exit = false;
2019-07-02 09:05:29 +02:00
private boolean searching = false;
2019-06-12 18:56:38 +02:00
2018-10-15 10:05:42 +00:00
static final int REQUEST_UNIFIED = 1;
2019-11-17 18:08:26 +01:00
static final int REQUEST_FOLDER = 2;
static final int REQUEST_WHY = 3;
2019-12-10 11:51:03 +01:00
static final int REQUEST_ALERT = 4;
static final int REQUEST_THREAD = 5;
static final int REQUEST_OUTBOX = 6;
static final int REQUEST_ERROR = 7;
static final int REQUEST_UPDATE = 8;
static final int REQUEST_WIDGET = 9;
2018-08-25 18:51:01 +00:00
static final String ACTION_VIEW_FOLDERS = BuildConfig.APPLICATION_ID + ".VIEW_FOLDERS";
2018-08-02 13:33:06 +00:00
static final String ACTION_VIEW_MESSAGES = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGES";
2019-05-13 14:08:51 +02:00
static final String ACTION_SEARCH = BuildConfig.APPLICATION_ID + ".SEARCH";
2018-10-15 10:05:42 +00:00
static final String ACTION_VIEW_THREAD = BuildConfig.APPLICATION_ID + ".VIEW_THREAD";
2018-08-02 13:33:06 +00:00
static final String ACTION_EDIT_FOLDER = BuildConfig.APPLICATION_ID + ".EDIT_FOLDER";
2019-01-18 08:28:07 +00:00
static final String ACTION_EDIT_ANSWERS = BuildConfig.APPLICATION_ID + ".EDIT_ANSWERS";
2018-08-27 09:39:27 +00:00
static final String ACTION_EDIT_ANSWER = BuildConfig.APPLICATION_ID + ".EDIT_ANSWER";
2019-01-18 08:23:53 +00:00
static final String ACTION_EDIT_RULES = BuildConfig.APPLICATION_ID + ".EDIT_RULES";
2019-01-17 13:29:35 +00:00
static final String ACTION_EDIT_RULE = BuildConfig.APPLICATION_ID + ".EDIT_RULE";
2018-08-02 13:33:06 +00:00
2019-07-02 09:05:29 +02:00
private static final long EXIT_DELAY = 2500L; // milliseconds
static final long UPDATE_INTERVAL = (BuildConfig.BETA_RELEASE ? 4 : 12) * 3600 * 1000L; // milliseconds
2018-09-08 10:37:28 +00:00
2018-08-02 13:33:06 +00:00
@Override
2019-08-13 10:27:17 +02:00
@SuppressLint("MissingSuperCall")
2018-08-02 13:33:06 +00:00
protected void onCreate(Bundle savedInstanceState) {
2019-08-13 10:27:17 +02:00
super.onCreate(savedInstanceState, false);
2019-07-02 09:05:29 +02:00
if (savedInstanceState != null)
searching = savedInstanceState.getBoolean("fair:searching");
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
startup = prefs.getString("startup", "unified");
Configuration config = getResources().getConfiguration();
boolean normal = config.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_NORMAL);
boolean landscape = prefs.getBoolean("landscape", true);
Log.i("Orientation=" + config.orientation + " normal=" + normal + " landscape=" + landscape);
view = LayoutInflater.from(this).inflate(
config.orientation == ORIENTATION_PORTRAIT || !normal || !landscape
? R.layout.activity_view_portrait
: R.layout.activity_view_landscape, null);
2018-08-25 11:27:54 +00:00
setContentView(view);
2018-08-02 13:33:06 +00:00
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
content_separator = findViewById(R.id.content_separator);
content_pane = findViewById(R.id.content_pane);
2018-08-02 13:33:06 +00:00
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);
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
drawerLayout.addDrawerListener(drawerToggle);
2019-04-28 20:48:45 +02:00
drawerContainer = findViewById(R.id.drawer_container);
2019-02-26 17:44:15 +00:00
2019-07-23 07:51:39 +02:00
// Accounts
rvAccount = drawerContainer.findViewById(R.id.rvAccount);
rvAccount.setLayoutManager(new LinearLayoutManager(this));
final AdapterNavAccount aadapter = new AdapterNavAccount(this, this);
rvAccount.setAdapter(aadapter);
2019-07-23 07:51:39 +02:00
// Unified system folders
2019-09-01 18:59:51 +02:00
ibExpanderUnified = drawerContainer.findViewById(R.id.ibExpanderUnified);
ibExpanderUnified.setVisibility(View.GONE);
2019-07-20 22:22:21 +02:00
grpUnified = drawerContainer.findViewById(R.id.grpUnified);
grpUnified.setVisibility(View.GONE);
2019-07-19 08:27:44 +02:00
rvUnified = drawerContainer.findViewById(R.id.rvUnified);
rvUnified.setLayoutManager(new LinearLayoutManager(this));
final AdapterNavUnified uadapter = new AdapterNavUnified(this, this);
rvUnified.setAdapter(uadapter);
2019-12-16 20:50:25 +01:00
boolean unified_system = prefs.getBoolean("unified_system", true);
2019-09-01 18:59:51 +02:00
ibExpanderUnified.setImageLevel(unified_system ? 0 /* less */ : 1 /* more */);
2019-07-20 22:22:21 +02:00
grpUnified.setVisibility(unified_system ? View.VISIBLE : View.GONE);
2019-09-01 18:59:51 +02:00
ibExpanderUnified.setOnClickListener(new View.OnClickListener() {
2019-07-20 22:22:21 +02:00
@Override
public void onClick(View v) {
2019-12-16 20:50:25 +01:00
boolean unified_system = !prefs.getBoolean("unified_system", true);
2019-07-20 22:22:21 +02:00
prefs.edit().putBoolean("unified_system", unified_system).apply();
2019-09-01 18:59:51 +02:00
ibExpanderUnified.setImageLevel(unified_system ? 0 /* less */ : 1 /* more */);
2019-07-20 22:22:21 +02:00
grpUnified.setVisibility(unified_system ? View.VISIBLE : View.GONE);
}
});
2019-07-23 07:51:39 +02:00
// Navigation folders
rvFolder = drawerContainer.findViewById(R.id.rvFolder);
rvFolder.setLayoutManager(new LinearLayoutManager(this));
final AdapterNavFolder fadapter = new AdapterNavFolder(this, this);
rvFolder.setAdapter(fadapter);
2019-02-26 17:44:15 +00:00
rvMenu = drawerContainer.findViewById(R.id.rvMenu);
rvMenu.setLayoutManager(new LinearLayoutManager(this));
final AdapterNavMenu madapter = new AdapterNavMenu(this, this);
rvMenu.setAdapter(madapter);
2018-08-02 13:33:06 +00:00
2019-07-23 07:51:39 +02:00
// Extra menus
2019-09-01 18:59:51 +02:00
ibExpanderExtra = drawerContainer.findViewById(R.id.ibExpanderExtra);
2019-02-26 17:44:15 +00:00
2019-04-29 11:39:24 +02:00
rvMenuExtra = drawerContainer.findViewById(R.id.rvMenuExtra);
LinearLayoutManager llm = new LinearLayoutManager(this);
rvMenuExtra.setLayoutManager(llm);
final AdapterNavMenu eadapter = new AdapterNavMenu(this, this);
rvMenuExtra.setAdapter(eadapter);
2018-12-24 10:57:03 +00:00
2019-04-29 11:39:24 +02:00
final Drawable d = getDrawable(R.drawable.divider);
DividerItemDecoration itemDecorator = new DividerItemDecoration(this, llm.getOrientation()) {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int pos = parent.getChildAdapterPosition(view);
NavMenuItem menu = eadapter.get(pos);
2019-04-29 12:04:45 +02:00
outRect.set(0, 0, 0, menu != null && menu.isSeparated() ? d.getIntrinsicHeight() : 0);
2019-04-29 11:39:24 +02:00
}
};
itemDecorator.setDrawable(d);
rvMenuExtra.addItemDecoration(itemDecorator);
boolean minimal = prefs.getBoolean("minimal", false);
2019-09-01 18:59:51 +02:00
ibExpanderExtra.setImageLevel(minimal ? 1 /* more */ : 0 /* less */);
2019-04-29 11:39:24 +02:00
rvMenuExtra.setVisibility(minimal ? View.GONE : View.VISIBLE);
2019-09-01 18:59:51 +02:00
ibExpanderExtra.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean minimal = !prefs.getBoolean("minimal", false);
prefs.edit().putBoolean("minimal", minimal).apply();
2019-09-01 18:59:51 +02:00
ibExpanderExtra.setImageLevel(minimal ? 1 /* more */ : 0 /* less */);
2019-04-29 11:39:24 +02:00
rvMenuExtra.setVisibility(minimal ? View.GONE : View.VISIBLE);
2019-07-20 22:22:21 +02:00
if (!minimal)
new Handler().post(new Runnable() {
@Override
public void run() {
drawerContainer.fullScroll(View.FOCUS_DOWN);
}
});
2018-11-13 14:44:57 +01:00
}
});
2018-08-02 13:33:06 +00:00
getSupportFragmentManager().addOnBackStackChangedListener(this);
2019-07-23 07:51:39 +02:00
// Fixed menus
2019-04-29 12:11:16 +02:00
PackageManager pm = getPackageManager();
final List<NavMenuItem> menus = new ArrayList<>();
2019-05-12 21:32:07 +02:00
final NavMenuItem navOperations = new NavMenuItem(R.drawable.baseline_dns_24, R.string.menu_operations, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuOperations();
}
2019-07-09 18:31:36 +02:00
});
menus.add(navOperations);
menus.add(new NavMenuItem(R.drawable.baseline_list_24, R.string.title_log, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onShowLog();
}
2019-07-09 18:31:36 +02:00
}));
menus.add(new NavMenuItem(R.drawable.baseline_reply_24, R.string.menu_answers, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuAnswers();
}
}));
2019-03-18 13:35:45 +00:00
menus.add(new NavMenuItem(R.drawable.baseline_settings_applications_24, R.string.menu_setup, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuSetup();
}
}));
2019-03-19 07:01:26 +00:00
madapter.set(menus);
2019-07-23 07:51:39 +02:00
// Collapsible menus
2019-04-29 11:39:24 +02:00
List<NavMenuItem> extra = new ArrayList<>();
2018-08-14 15:57:32 +00:00
2019-04-29 11:39:24 +02:00
extra.add(new NavMenuItem(R.drawable.baseline_help_24, R.string.menu_legend, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuLegend();
}
}));
2019-08-15 07:58:20 +02:00
extra.add(new NavMenuItem(R.drawable.baseline_question_answer_24, R.string.menu_faq, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuFAQ();
}
}, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onDebugInfo();
}
}).setExternal(true));
2019-06-08 21:50:17 +02:00
if (Helper.getIntentIssue(this).resolveActivity(pm) != null)
2019-05-11 20:19:23 +02:00
extra.add(new NavMenuItem(R.drawable.baseline_feedback_24, R.string.menu_issue, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuIssue();
}
2019-08-13 11:33:12 +02:00
}).setExternal(true));
2019-09-30 12:38:24 +02:00
if (Helper.isPlayStoreInstall())
extra.add(new NavMenuItem(R.drawable.baseline_bug_report_24, R.string.menu_test, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuTest();
}
}).setExternal(true));
extra.add(new NavMenuItem(R.drawable.baseline_account_box_24, R.string.menu_privacy, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuPrivacy();
}
}));
2018-08-13 06:59:05 +00:00
2019-04-29 11:39:24 +02:00
extra.add(new NavMenuItem(R.drawable.baseline_info_24, R.string.menu_about, new Runnable() {
@Override
public void run() {
onMenuAbout();
}
}, new Runnable() {
@Override
public void run() {
2019-09-10 09:05:21 +02:00
if (!Helper.isPlayStoreInstall()) {
drawerLayout.closeDrawer(drawerContainer);
checkUpdate(true);
}
}
2019-04-29 11:39:24 +02:00
}).setSeparated());
2019-01-14 13:33:16 +00:00
2019-08-13 10:27:17 +02:00
extra.add(new NavMenuItem(R.drawable.baseline_monetization_on_24, R.string.menu_pro, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
startActivity(new Intent(ActivityView.this, ActivityBilling.class));
}
}));
2019-06-30 11:35:03 +02:00
if ((getIntentInvite(this).resolveActivity(pm) != null))
2019-04-29 11:39:24 +02:00
extra.add(new NavMenuItem(R.drawable.baseline_people_24, R.string.menu_invite, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuInvite();
}
2019-08-13 11:33:12 +02:00
}).setExternal(true));
2019-09-10 09:05:21 +02:00
if ((Helper.isPlayStoreInstall() || BuildConfig.DEBUG) &&
2019-08-15 07:58:20 +02:00
getIntentRate(this).resolveActivity(pm) != null)
2019-04-29 11:39:24 +02:00
extra.add(new NavMenuItem(R.drawable.baseline_star_24, R.string.menu_rate, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuRate();
}
2019-08-13 11:33:12 +02:00
}).setExternal(true));
2019-04-29 12:11:16 +02:00
if (getIntentOtherApps().resolveActivity(pm) != null)
2019-04-29 11:39:24 +02:00
extra.add(new NavMenuItem(R.drawable.baseline_get_app_24, R.string.menu_other, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
onMenuOtherApps();
}
2019-08-13 11:33:12 +02:00
}).setExternal(true));
2019-04-29 11:39:24 +02:00
eadapter.set(extra);
2019-01-14 19:52:01 +00:00
2019-07-23 07:51:39 +02:00
// Live data
DB db = DB.getInstance(this);
2018-10-10 13:45:50 +00:00
db.account().liveAccountsEx(false).observe(this, new Observer<List<TupleAccountEx>>() {
@Override
public void onChanged(@Nullable List<TupleAccountEx> accounts) {
if (accounts == null)
accounts = new ArrayList<>();
aadapter.set(accounts);
}
});
2018-09-07 11:08:20 +00:00
db.folder().liveUnified().observe(this, new Observer<List<TupleFolderUnified>>() {
@Override
public void onChanged(List<TupleFolderUnified> folders) {
if (folders == null)
folders = new ArrayList<>();
2019-09-01 18:59:51 +02:00
ibExpanderUnified.setVisibility(folders.size() > 0 ? View.VISIBLE : View.GONE);
2019-12-16 20:50:25 +01:00
boolean unified_system = prefs.getBoolean("unified_system", true);
grpUnified.setVisibility(unified_system && folders.size() > 0 ? View.VISIBLE : View.GONE);
uadapter.set(folders);
}
});
2019-07-19 08:27:44 +02:00
db.folder().liveNavigation().observe(this, new Observer<List<TupleFolderNav>>() {
@Override
public void onChanged(List<TupleFolderNav> folders) {
if (folders == null)
folders = new ArrayList<>();
fadapter.set(folders);
}
});
2019-03-01 09:07:15 +00:00
2019-05-04 22:38:11 +02:00
db.operation().liveStats().observe(this, new Observer<TupleOperationStats>() {
@Override
2019-05-04 22:38:11 +02:00
public void onChanged(TupleOperationStats stats) {
navOperations.setWarning(stats != null && stats.errors != null && stats.errors > 0);
2019-05-04 22:38:11 +02:00
navOperations.setCount(stats == null ? 0 : stats.pending);
madapter.notifyDataSetChanged();
}
});
2018-08-02 13:33:06 +00:00
2019-07-23 07:51:39 +02:00
// Initialize
if (content_pane != null) {
content_separator.setVisibility(View.GONE);
content_pane.setVisibility(View.GONE);
}
2019-03-19 17:34:24 +00:00
if (getSupportFragmentManager().getFragments().size() == 0 &&
!getIntent().hasExtra(Intent.EXTRA_PROCESS_TEXT))
init();
2018-08-07 18:31:14 +00:00
2018-08-23 18:44:23 +00:00
if (savedInstanceState != null)
2019-03-02 07:35:12 +00:00
drawerToggle.setDrawerIndicatorEnabled(savedInstanceState.getBoolean("fair:toggle"));
2018-08-23 18:44:23 +00:00
checkFirst();
checkCrash();
2018-10-28 12:49:13 +00:00
Shortcuts.update(this, this);
2018-08-02 13:33:06 +00:00
}
private void init() {
Bundle args = new Bundle();
FragmentBase fragment;
switch (startup) {
case "accounts":
fragment = new FragmentAccounts();
args.putBoolean("settings", false);
break;
case "folders":
fragment = new FragmentFolders();
break;
default:
fragment = new FragmentMessages();
}
fragment.setArguments(args);
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
for (Fragment existing : fm.getFragments())
fragmentTransaction.remove(existing);
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("unified");
fragmentTransaction.commit();
}
2018-08-23 18:44:23 +00:00
@Override
protected void onSaveInstanceState(Bundle outState) {
2019-03-02 07:35:12 +00:00
outState.putBoolean("fair:toggle", drawerToggle.isDrawerIndicatorEnabled());
2019-07-02 09:05:29 +02:00
outState.putBoolean("fair:searching", searching);
2019-04-11 19:30:39 +02:00
super.onSaveInstanceState(outState);
2018-08-23 18:44:23 +00:00
}
2018-08-02 13:33:06 +00:00
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
2018-08-06 19:56:10 +00:00
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
2018-10-16 10:20:31 +00:00
setIntent(intent);
2018-08-02 13:33:06 +00:00
}
@Override
protected void onResume() {
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_FOLDERS);
2018-08-02 13:33:06 +00:00
iff.addAction(ACTION_VIEW_MESSAGES);
2019-05-13 14:08:51 +02:00
iff.addAction(ACTION_SEARCH);
2018-10-15 10:05:42 +00:00
iff.addAction(ACTION_VIEW_THREAD);
2018-08-02 13:33:06 +00:00
iff.addAction(ACTION_EDIT_FOLDER);
2019-01-18 08:28:07 +00:00
iff.addAction(ACTION_EDIT_ANSWERS);
2018-08-27 09:39:27 +00:00
iff.addAction(ACTION_EDIT_ANSWER);
2019-01-18 08:23:53 +00:00
iff.addAction(ACTION_EDIT_RULES);
2019-01-17 13:29:35 +00:00
iff.addAction(ACTION_EDIT_RULE);
2018-08-02 13:33:06 +00:00
lbm.registerReceiver(receiver, iff);
2018-10-16 10:20:31 +00:00
2019-04-01 08:15:41 +02:00
checkUpdate(false);
2019-09-18 10:42:13 +02:00
checkIntent();
2018-08-02 13:33:06 +00:00
}
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
lbm.unregisterReceiver(receiver);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onBackPressed() {
2019-04-28 20:48:45 +02:00
if (drawerLayout.isDrawerOpen(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
2019-06-12 18:56:38 +02:00
else {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (exit || count > 1)
super.onBackPressed();
2019-06-23 16:05:36 +02:00
else if (!backHandled()) {
2019-07-15 22:13:13 +02:00
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getOriginalContext());
boolean double_back = prefs.getBoolean("double_back", true);
if (searching || !double_back)
2019-07-02 09:05:29 +02:00
super.onBackPressed();
else {
exit = true;
2019-07-13 08:58:56 +02:00
ToastEx.makeText(this, R.string.app_exit, Toast.LENGTH_SHORT).show();
2019-07-02 09:05:29 +02:00
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
exit = false;
}
}, EXIT_DELAY);
}
2019-06-12 18:56:38 +02:00
}
}
2018-08-02 13:33:06 +00:00
}
@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();
else {
2019-04-28 20:48:45 +02:00
if (drawerLayout.isDrawerOpen(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
drawerToggle.setDrawerIndicatorEnabled(count == 1);
if (content_pane != null) {
2018-11-09 16:16:41 +00:00
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.content_pane);
content_separator.setVisibility(fragment == null ? View.GONE : View.VISIBLE);
content_pane.setVisibility(fragment == null ? View.GONE : View.VISIBLE);
2018-11-09 16:16:41 +00:00
}
}
2018-08-02 13:33:06 +00:00
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item))
return true;
2019-10-04 16:57:40 +02:00
return super.onOptionsItemSelected(item);
2018-08-02 13:33:06 +00:00
}
private void checkFirst() {
2019-06-30 11:35:03 +02:00
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.getBoolean("first", true))
2019-06-30 19:56:23 +02:00
new FragmentDialogFirst().show(getSupportFragmentManager(), "first");
}
private void checkCrash() {
new SimpleTask<Long>() {
@Override
2018-12-31 07:03:48 +00:00
protected Long onExecute(Context context, Bundle args) throws Throwable {
File file = new File(context.getCacheDir(), "crash.log");
if (file.exists()) {
StringBuilder sb = new StringBuilder();
try {
2019-02-22 16:59:23 +01:00
String line;
try (BufferedReader in = new BufferedReader(new FileReader(file))) {
2018-12-24 10:47:21 +00:00
while ((line = in.readLine()) != null)
sb.append(line).append("\r\n");
2018-12-05 13:59:35 +01:00
}
2019-05-12 19:14:34 +02:00
return Log.getDebugInfo(context, R.string.title_crash_info_remark, null, sb.toString()).id;
} finally {
2018-12-24 10:47:21 +00:00
file.delete();
}
}
return null;
}
@Override
2018-12-31 07:03:48 +00:00
protected void onExecuted(Bundle args, Long id) {
if (id != null)
startActivity(
new Intent(ActivityView.this, ActivityCompose.class)
.putExtra("action", "edit")
.putExtra("id", id));
}
2018-12-01 10:47:08 +01:00
@Override
protected void onException(Bundle args, Throwable ex) {
2019-07-13 08:58:56 +02:00
ToastEx.makeText(ActivityView.this,
2019-12-06 08:50:46 +01:00
Log.formatThrowable(ex, false), Toast.LENGTH_LONG).show();
2018-12-01 10:47:08 +01:00
}
2019-01-09 18:45:40 +00:00
}.execute(this, new Bundle(), "crash:log");
}
2019-01-09 19:21:09 +00:00
private void checkUpdate(boolean always) {
2019-09-10 09:05:21 +02:00
if (Helper.isPlayStoreInstall() || !Helper.hasValidFingerprint(this))
2019-04-01 08:15:41 +02:00
return;
2018-11-10 11:09:30 +00:00
long now = new Date().getTime();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
2019-01-09 19:21:09 +00:00
if (!always && !prefs.getBoolean("updates", true))
2018-11-10 11:09:30 +00:00
return;
2019-01-09 19:21:09 +00:00
if (!always && prefs.getLong("last_update_check", 0) + UPDATE_INTERVAL > now)
2018-09-08 10:37:28 +00:00
return;
2018-11-10 11:09:30 +00:00
prefs.edit().putLong("last_update_check", now).apply();
2018-09-08 10:37:28 +00:00
2019-01-11 06:25:06 +00:00
Bundle args = new Bundle();
args.putBoolean("always", always);
2018-09-08 09:41:05 +00:00
new SimpleTask<UpdateInfo>() {
@Override
2018-12-31 07:03:48 +00:00
protected UpdateInfo onExecute(Context context, Bundle args) throws Throwable {
2019-01-11 06:25:06 +00:00
StringBuilder response = new StringBuilder();
2018-09-08 09:41:05 +00:00
HttpsURLConnection urlConnection = null;
try {
URL latest = new URL(BuildConfig.GITHUB_LATEST_API);
2018-09-08 09:41:05 +00:00
urlConnection = (HttpsURLConnection) latest.openConnection();
2019-01-11 06:25:06 +00:00
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(false);
urlConnection.connect();
int status = urlConnection.getResponseCode();
InputStream inputStream = (status == HttpsURLConnection.HTTP_OK
? urlConnection.getInputStream() : urlConnection.getErrorStream());
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
2018-09-08 09:41:05 +00:00
String line;
while ((line = br.readLine()) != null)
2019-01-11 06:25:06 +00:00
response.append(line);
2019-04-01 10:40:56 +02:00
if (status == HttpsURLConnection.HTTP_FORBIDDEN) {
// {"message":"API rate limit exceeded for ...","documentation_url":"https://developer.github.com/v3/#rate-limiting"}
JSONObject jmessage = new JSONObject(response.toString());
if (jmessage.has("message"))
throw new IllegalArgumentException(jmessage.getString("message"));
throw new IOException("HTTP " + status + ": " + response.toString());
}
2019-01-11 06:25:06 +00:00
if (status != HttpsURLConnection.HTTP_OK)
throw new IOException("HTTP " + status + ": " + response.toString());
JSONObject jroot = new JSONObject(response.toString());
2019-06-14 09:33:39 +02:00
if (!jroot.has("tag_name") || jroot.isNull("tag_name"))
2019-01-11 06:25:06 +00:00
throw new IOException("tag_name field missing");
2019-06-14 09:33:39 +02:00
if (!jroot.has("html_url") || jroot.isNull("html_url"))
2019-01-11 06:25:06 +00:00
throw new IOException("html_url field missing");
2019-06-14 09:33:39 +02:00
if (!jroot.has("assets") || jroot.isNull("assets"))
2019-01-11 06:25:06 +00:00
throw new IOException("assets section missing");
// Get update info
UpdateInfo info = new UpdateInfo();
info.tag_name = jroot.getString("tag_name");
info.html_url = jroot.getString("html_url");
// Check if new release
JSONArray jassets = jroot.getJSONArray("assets");
for (int i = 0; i < jassets.length(); i++) {
JSONObject jasset = jassets.getJSONObject(i);
2019-06-14 09:33:39 +02:00
if (jasset.has("name") && !jasset.isNull("name")) {
2019-01-11 06:25:06 +00:00
String name = jasset.getString("name");
2019-06-14 09:33:39 +02:00
if (name.endsWith(".apk")) {
Log.i("Latest version=" + info.tag_name);
2019-01-11 06:25:06 +00:00
if (BuildConfig.VERSION_NAME.equals(info.tag_name))
return null;
else
return info;
2018-09-08 09:41:05 +00:00
}
}
}
2018-11-10 11:09:30 +00:00
2019-01-24 07:10:33 +00:00
return null;
2018-09-08 09:41:05 +00:00
} finally {
if (urlConnection != null)
urlConnection.disconnect();
}
}
@Override
2018-12-31 07:03:48 +00:00
protected void onExecuted(Bundle args, UpdateInfo info) {
2019-04-05 11:48:28 +02:00
boolean always = args.getBoolean("always");
2019-01-11 06:25:06 +00:00
if (info == null) {
2019-06-19 10:55:11 +02:00
if (always)
2019-07-13 08:58:56 +02:00
ToastEx.makeText(ActivityView.this, BuildConfig.VERSION_NAME, Toast.LENGTH_LONG).show();
2018-09-16 13:31:36 +00:00
return;
2019-01-11 06:25:06 +00:00
}
2018-09-16 13:31:36 +00:00
NotificationCompat.Builder builder =
2019-06-23 15:17:45 +02:00
new NotificationCompat.Builder(ActivityView.this, "update")
2019-07-09 13:17:28 +02:00
.setSmallIcon(R.drawable.baseline_get_app_24)
.setContentTitle(getString(R.string.title_updated, info.tag_name))
.setAutoCancel(true)
.setShowWhen(false)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setCategory(NotificationCompat.CATEGORY_REMINDER)
.setVisibility(NotificationCompat.VISIBILITY_SECRET);
Intent update = new Intent(Intent.ACTION_VIEW, Uri.parse(info.html_url));
if (update.resolveActivity(getPackageManager()) != null) {
PendingIntent piUpdate = PendingIntent.getActivity(
ActivityView.this, REQUEST_UPDATE, update, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(piUpdate);
}
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(Helper.NOTIFICATION_UPDATE, builder.build());
2018-09-08 09:41:05 +00:00
}
@Override
protected void onException(Bundle args, Throwable ex) {
2019-01-11 06:25:06 +00:00
if (args.getBoolean("always"))
if (ex instanceof IllegalArgumentException || ex instanceof IOException)
2019-07-13 08:58:56 +02:00
ToastEx.makeText(ActivityView.this, ex.getMessage(), Toast.LENGTH_LONG).show();
2019-04-01 10:40:56 +02:00
else
2019-12-06 08:50:46 +01:00
Log.unexpectedError(getSupportFragmentManager(), ex);
2018-09-08 09:41:05 +00:00
}
2019-01-11 06:25:06 +00:00
}.execute(this, args, "update:check");
2018-09-08 09:41:05 +00:00
}
2019-09-18 10:42:13 +02:00
private void checkIntent() {
Intent intent = getIntent();
// Refresh from widget
2019-09-18 10:42:13 +02:00
if (intent.getBooleanExtra("refresh", false)) {
intent.removeExtra("refresh");
setIntent(intent);
2019-12-07 21:16:57 +01:00
new SimpleTask<Void>() {
@Override
protected Void onExecute(Context context, Bundle args) {
WorkerPoll.sync(context, null);
2019-12-07 21:16:57 +01:00
return null;
}
@Override
protected void onException(Bundle args, Throwable ex) {
Log.unexpectedError(getSupportFragmentManager(), ex);
}
}.execute(this, new Bundle(), "view:refresh");
2019-09-18 10:42:13 +02:00
}
String action = intent.getAction();
Log.i("View intent=" + intent + " action=" + action);
if (action != null) {
intent.setAction(null);
setIntent(intent);
2019-10-02 11:32:00 +02:00
if (action.startsWith("unified")) {
2019-09-18 10:42:13 +02:00
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getSupportFragmentManager().popBackStack("unified", 0);
2019-10-02 11:32:00 +02:00
if (action.contains(":")) {
Intent clear = new Intent(this, ServiceUI.class)
.setAction(action.replace("unified", "clear"));
startService(clear);
}
2019-11-17 18:08:26 +01:00
} else if (action.startsWith("folder")) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getSupportFragmentManager().popBackStack("unified", 0);
long folder = Long.parseLong(action.split(":", 2)[1]);
if (folder > 0) {
intent.putExtra("folder", folder);
onViewMessages(intent);
}
2019-09-18 10:42:13 +02:00
} else if ("why".equals(action)) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getSupportFragmentManager().popBackStack("unified", 0);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ActivityView.this);
boolean why = prefs.getBoolean("why", false);
if (!why || BuildConfig.DEBUG) {
prefs.edit().putBoolean("why", true).apply();
Helper.viewFAQ(this, 2);
}
2019-12-10 11:51:03 +01:00
} else if ("alert".equals(action)) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getSupportFragmentManager().popBackStack("unified", 0);
Helper.viewFAQ(this, 23);
2019-09-18 10:42:13 +02:00
} else if ("outbox".equals(action))
onMenuOutbox();
else if (action.startsWith("thread")) {
intent.putExtra("thread", action.split(":", 2)[1]);
onViewThread(intent);
} else if (action.equals("widget"))
onViewThread(intent);
}
if (intent.hasExtra(Intent.EXTRA_PROCESS_TEXT)) {
CharSequence csearch = getIntent().getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT);
String search = (csearch == null ? null : csearch.toString());
if (!TextUtils.isEmpty(search)) {
searching = true;
FragmentMessages.search(
ActivityView.this, ActivityView.this, getSupportFragmentManager(),
2019-11-16 12:53:36 +01:00
-1, -1, false, search);
2019-09-18 10:42:13 +02:00
}
intent.removeExtra(Intent.EXTRA_PROCESS_TEXT);
setIntent(intent);
}
}
2018-08-17 05:46:22 +00:00
private Intent getIntentOtherApps() {
Intent intent = new Intent(Intent.ACTION_VIEW);
2019-11-06 10:29:25 +01:00
intent.setData(Uri.parse(BuildConfig.APPS_URI));
2018-08-17 05:46:22 +00:00
return intent;
}
private void onMenuFolders(long account) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
2018-11-24 17:30:17 +01:00
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();
}
2019-03-18 13:35:45 +00:00
private void onMenuOutbox() {
Bundle args = new Bundle();
2019-09-11 12:37:50 +02:00
new SimpleTask<EntityFolder>() {
2019-03-18 13:35:45 +00:00
@Override
2019-09-11 12:37:50 +02:00
protected EntityFolder onExecute(Context context, Bundle args) {
2019-03-18 13:35:45 +00:00
DB db = DB.getInstance(context);
EntityFolder outbox = db.folder().getOutbox();
2019-09-11 12:37:50 +02:00
return outbox;
2019-03-18 13:35:45 +00:00
}
@Override
2019-09-11 12:37:50 +02:00
protected void onExecuted(Bundle args, EntityFolder outbox) {
if (outbox == null)
return;
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
2019-03-18 13:35:45 +00:00
getSupportFragmentManager().popBackStack("unified", 0);
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(ActivityView.this);
lbm.sendBroadcast(
new Intent(ActivityView.ACTION_VIEW_MESSAGES)
2019-03-25 15:43:56 +00:00
.putExtra("account", -1L)
2019-09-11 12:37:50 +02:00
.putExtra("folder", outbox.id)
.putExtra("type", outbox.type));
2019-03-18 13:35:45 +00:00
}
@Override
protected void onException(Bundle args, Throwable ex) {
2019-12-06 08:50:46 +01:00
Log.unexpectedError(getSupportFragmentManager(), ex);
2019-03-18 13:35:45 +00:00
}
}.execute(this, args, "menu:outbox");
2019-03-18 13:35:45 +00:00
}
2019-04-25 09:02:29 +02:00
private void onMenuOperations() {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
2019-04-25 09:02:29 +02:00
getSupportFragmentManager().popBackStack("operations", FragmentManager.POP_BACK_STACK_INCLUSIVE);
2019-03-15 07:34:31 +00:00
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
2019-04-25 09:02:29 +02:00
fragmentTransaction.replace(R.id.content_frame, new FragmentOperations()).addToBackStack("operations");
fragmentTransaction.commit();
}
2019-04-25 09:02:29 +02:00
private void onMenuAnswers() {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
2019-04-25 09:02:29 +02:00
getSupportFragmentManager().popBackStack("answers", FragmentManager.POP_BACK_STACK_INCLUSIVE);
2019-03-15 07:34:31 +00:00
2018-08-13 06:59:05 +00:00
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
2019-04-25 09:02:29 +02:00
fragmentTransaction.replace(R.id.content_frame, new FragmentAnswers()).addToBackStack("answers");
2018-08-13 06:59:05 +00:00
fragmentTransaction.commit();
}
2019-01-14 13:20:47 +00:00
private void onMenuSetup() {
startActivity(new Intent(ActivityView.this, ActivitySetup.class));
2018-08-06 17:04:24 +00:00
}
2019-01-14 13:20:47 +00:00
private void onMenuLegend() {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
2019-03-15 07:34:31 +00:00
getSupportFragmentManager().popBackStack("legend", FragmentManager.POP_BACK_STACK_INCLUSIVE);
2018-08-26 06:11:06 +00:00
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
2019-01-14 13:20:47 +00:00
fragmentTransaction.replace(R.id.content_frame, new FragmentLegend()).addToBackStack("legend");
2018-08-26 06:11:06 +00:00
fragmentTransaction.commit();
2018-08-25 11:27:54 +00:00
}
private void onMenuTest() {
Helper.view(this, Uri.parse(Helper.TEST_URI), false);
}
2019-01-14 13:20:47 +00:00
private void onMenuFAQ() {
2019-08-15 07:58:20 +02:00
Helper.viewFAQ(this, 0);
2019-01-14 13:20:47 +00:00
}
private void onMenuIssue() {
startActivity(Helper.getIntentIssue(this));
}
2018-08-22 06:20:31 +00:00
private void onMenuPrivacy() {
Bundle args = new Bundle();
args.putString("name", "PRIVACY.md");
FragmentDialogMarkdown fragment = new FragmentDialogMarkdown();
fragment.setArguments(args);
fragment.show(getSupportFragmentManager(), "privacy");
2018-08-22 06:20:31 +00:00
}
private void onMenuAbout() {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
2019-03-15 07:34:31 +00:00
getSupportFragmentManager().popBackStack("about", FragmentManager.POP_BACK_STACK_INCLUSIVE);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, new FragmentAbout()).addToBackStack("about");
fragmentTransaction.commit();
2018-08-02 17:07:02 +00:00
}
2019-01-27 12:35:23 +00:00
private void onMenuInvite() {
2019-06-30 11:35:03 +02:00
startActivity(getIntentInvite(this));
2019-01-27 12:35:23 +00:00
}
private void onMenuRate() {
2019-08-15 07:58:20 +02:00
new FragmentDialogRate().show(getSupportFragmentManager(), "rate");
}
2018-11-24 17:30:17 +01:00
private void onMenuOtherApps() {
2019-07-01 20:34:02 +02:00
Helper.view(this, getIntentOtherApps());
}
2018-11-13 16:01:29 +01:00
private void onDebugInfo() {
new SimpleTask<Long>() {
@Override
2018-12-31 07:03:48 +00:00
protected Long onExecute(Context context, Bundle args) throws IOException {
2019-05-12 19:14:34 +02:00
return Log.getDebugInfo(context, R.string.title_debug_info_remark, null, null).id;
2018-11-13 16:01:29 +01:00
}
@Override
2018-12-31 07:03:48 +00:00
protected void onExecuted(Bundle args, Long id) {
2018-12-24 10:47:21 +00:00
startActivity(new Intent(ActivityView.this, ActivityCompose.class)
.putExtra("action", "edit")
.putExtra("id", id));
2018-11-13 16:01:29 +01:00
}
@Override
protected void onException(Bundle args, Throwable ex) {
2018-12-24 10:47:21 +00:00
if (ex instanceof IllegalArgumentException)
2019-07-13 08:58:56 +02:00
ToastEx.makeText(ActivityView.this, ex.getMessage(), Toast.LENGTH_LONG).show();
2018-12-24 10:47:21 +00:00
else
2019-07-13 08:58:56 +02:00
ToastEx.makeText(ActivityView.this, ex.toString(), Toast.LENGTH_LONG).show();
2018-11-13 16:01:29 +01:00
}
2018-12-07 08:40:52 +01:00
2019-01-09 18:45:40 +00:00
}.execute(this, new Bundle(), "debug:info");
2018-11-13 16:01:29 +01:00
}
private void onShowLog() {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getSupportFragmentManager().popBackStack("logs", FragmentManager.POP_BACK_STACK_INCLUSIVE);
2018-10-10 13:45:50 +00:00
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, new FragmentLogs()).addToBackStack("logs");
fragmentTransaction.commit();
2018-08-17 05:46:22 +00:00
}
2019-05-27 12:15:25 +02:00
private BroadcastReceiver receiver = new BroadcastReceiver() {
2018-08-02 13:33:06 +00:00
@Override
public void onReceive(Context context, Intent intent) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
2018-12-12 15:59:34 +01:00
String action = intent.getAction();
if (ACTION_VIEW_FOLDERS.equals(action))
onViewFolders(intent);
else if (ACTION_VIEW_MESSAGES.equals(action))
2018-12-12 15:59:34 +01:00
onViewMessages(intent);
2019-05-13 14:08:51 +02:00
else if (ACTION_SEARCH.equals(action))
onSearchMessages(intent);
2018-12-12 15:59:34 +01:00
else if (ACTION_VIEW_THREAD.equals(action))
onViewThread(intent);
else if (ACTION_EDIT_FOLDER.equals(action))
onEditFolder(intent);
2019-01-18 08:28:07 +00:00
else if (ACTION_EDIT_ANSWERS.equals(action))
onEditAnswers(intent);
2018-12-12 15:59:34 +01:00
else if (ACTION_EDIT_ANSWER.equals(action))
onEditAnswer(intent);
2019-01-18 08:23:53 +00:00
else if (ACTION_EDIT_RULES.equals(action))
onEditRules(intent);
2019-01-17 13:29:35 +00:00
else if (ACTION_EDIT_RULE.equals(action))
onEditRule(intent);
2018-12-12 15:59:34 +01:00
}
2018-08-25 18:43:13 +00:00
}
};
2018-08-09 20:45:42 +00:00
private void onViewFolders(Intent intent) {
long account = intent.getLongExtra("id", -1);
onMenuFolders(account);
}
2018-08-25 18:43:13 +00:00
private void onViewMessages(Intent intent) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getSupportFragmentManager().popBackStack("messages", FragmentManager.POP_BACK_STACK_INCLUSIVE);
2018-10-17 09:15:44 +00:00
Bundle args = new Bundle();
2019-07-19 08:27:44 +02:00
args.putString("type", intent.getStringExtra("type"));
2018-10-17 09:15:44 +00:00
args.putLong("account", intent.getLongExtra("account", -1));
args.putLong("folder", intent.getLongExtra("folder", -1));
2018-08-25 18:43:13 +00:00
FragmentMessages fragment = new FragmentMessages();
2018-10-17 09:15:44 +00:00
fragment.setArguments(args);
2018-08-25 18:43:13 +00:00
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("messages");
fragmentTransaction.commit();
}
2019-05-13 14:08:51 +02:00
private void onSearchMessages(Intent intent) {
2019-11-16 12:53:36 +01:00
long account = intent.getLongExtra("account", -1);
2019-05-13 14:08:51 +02:00
long folder = intent.getLongExtra("folder", -1);
2019-05-13 15:56:44 +02:00
String query = intent.getStringExtra("query");
2019-05-13 14:08:51 +02:00
FragmentMessages.search(
this, this, getSupportFragmentManager(),
2019-11-16 12:53:36 +01:00
account, folder, false, query);
2019-05-13 14:08:51 +02:00
}
2018-10-15 10:05:42 +00:00
private void onViewThread(Intent intent) {
2019-02-05 08:15:05 +00:00
boolean found = intent.getBooleanExtra("found", false);
if (!found && getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
2018-11-24 17:30:17 +01:00
getSupportFragmentManager().popBackStack("thread", FragmentManager.POP_BACK_STACK_INCLUSIVE);
2018-10-15 10:05:42 +00:00
Bundle args = new Bundle();
2018-10-17 09:15:44 +00:00
args.putLong("account", intent.getLongExtra("account", -1));
args.putString("thread", intent.getStringExtra("thread"));
args.putLong("id", intent.getLongExtra("id", -1));
2019-02-05 08:15:05 +00:00
args.putBoolean("found", found);
2018-08-09 20:45:42 +00:00
2018-10-15 10:05:42 +00:00
FragmentMessages fragment = new FragmentMessages();
fragment.setArguments(args);
2018-08-11 05:02:13 +00:00
int pane;
if (content_pane == null)
pane = R.id.content_frame;
else {
pane = R.id.content_pane;
content_separator.setVisibility(View.VISIBLE);
content_pane.setVisibility(View.VISIBLE);
2018-12-22 12:53:07 +01:00
args.putBoolean("pane", true);
}
2018-10-15 10:05:42 +00:00
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(pane, fragment).addToBackStack("thread");
2018-10-15 10:05:42 +00:00
fragmentTransaction.commit();
}
2018-08-09 20:45:42 +00:00
2018-08-25 18:43:13 +00:00
private void onEditFolder(Intent intent) {
FragmentFolder fragment = new FragmentFolder();
fragment.setArguments(intent.getExtras());
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("folder");
fragmentTransaction.commit();
}
2018-08-25 11:27:54 +00:00
2019-01-18 08:28:07 +00:00
private void onEditAnswers(Intent intent) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, new FragmentAnswers()).addToBackStack("answers");
fragmentTransaction.commit();
}
2018-08-27 09:39:27 +00:00
private void onEditAnswer(Intent intent) {
FragmentAnswer fragment = new FragmentAnswer();
fragment.setArguments(intent.getExtras());
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("answer");
fragmentTransaction.commit();
}
2019-01-18 08:23:53 +00:00
private void onEditRules(Intent intent) {
FragmentRules fragment = new FragmentRules();
fragment.setArguments(intent.getExtras());
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("rules");
fragmentTransaction.commit();
}
2019-01-17 13:29:35 +00:00
private void onEditRule(Intent intent) {
FragmentRule fragment = new FragmentRule();
fragment.setArguments(intent.getExtras());
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("rule");
fragmentTransaction.commit();
}
2019-06-30 11:35:03 +02:00
private class UpdateInfo {
String tag_name; // version
String html_url;
}
private static Intent getIntentInvite(Context context) {
StringBuilder sb = new StringBuilder();
sb.append(context.getString(R.string.title_try)).append("\n\n");
sb.append(BuildConfig.INVITE_URI).append("\n\n");
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.app_name));
intent.putExtra(Intent.EXTRA_TEXT, sb.toString());
return intent;
}
private static Intent getIntentRate(Context context) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + BuildConfig.APPLICATION_ID));
if (intent.resolveActivity(context.getPackageManager()) == null)
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID));
return intent;
}
2019-09-11 21:43:27 +02:00
public static class FragmentDialogFirst extends FragmentDialogBase {
2019-06-30 11:35:03 +02:00
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
return new AlertDialog.Builder(getContext())
.setMessage(getString(R.string.title_hint_sync))
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
prefs.edit().putBoolean("first", false).apply();
}
})
2019-09-12 13:23:32 +02:00
.setNegativeButton(android.R.string.cancel, null)
2019-06-30 11:35:03 +02:00
.create();
}
}
2019-09-11 21:43:27 +02:00
public static class FragmentDialogRate extends FragmentDialogBase {
2019-06-30 11:35:03 +02:00
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
return new AlertDialog.Builder(getContext())
.setMessage(R.string.title_issue)
.setPositiveButton(R.string.title_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
2019-08-15 07:58:20 +02:00
Helper.viewFAQ(getContext(), 0);
2019-06-30 11:35:03 +02:00
}
})
.setNegativeButton(R.string.title_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
2019-07-01 20:34:02 +02:00
Helper.view(getContext(), getIntentRate(getContext()));
2019-06-30 11:35:03 +02:00
}
})
.create();
}
}
2018-08-02 13:33:06 +00:00
}