Improved three columns implementation

This commit is contained in:
M66B 2020-01-03 11:32:50 +01:00
parent 9530fca776
commit 68e2df562b
4 changed files with 77 additions and 70 deletions

View File

@ -31,6 +31,7 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
@ -40,6 +41,7 @@ import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ScrollView;
import android.widget.Toast;
@ -78,6 +80,8 @@ import java.util.List;
import javax.net.ssl.HttpsURLConnection;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_LOCKED_OPEN;
import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_UNLOCKED;
public class ActivityView extends ActivityBilling implements FragmentManager.OnBackStackChangedListener {
private String startup;
@ -138,8 +142,10 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
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);
final boolean landscape = prefs.getBoolean("landscape", true);
final boolean landscape3 = prefs.getBoolean("landscape3", true);
Log.i("Orientation=" + config.orientation + " normal=" + normal +
" landscape=" + landscape + "/" + landscape3);
view = LayoutInflater.from(this).inflate(
config.orientation == ORIENTATION_PORTRAIT || !normal || !landscape
@ -154,13 +160,34 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
drawerLayout = findViewById(R.id.drawer_layout);
final ViewGroup childContent = (ViewGroup) drawerLayout.getChildAt(0);
final ViewGroup childDrawer = (ViewGroup) drawerLayout.getChildAt(1);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.app_name, R.string.app_name) {
public void onDrawerClosed(View view) {
if (landscape && landscape3 &&
config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
drawerLayout.setDrawerLockMode(LOCK_MODE_UNLOCKED);
drawerLayout.setScrimColor(Helper.resolveColor(ActivityView.this, R.attr.colorDrawerScrim));
}
super.onDrawerClosed(view);
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (landscape && landscape3 &&
config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
drawerLayout.setDrawerLockMode(LOCK_MODE_LOCKED_OPEN);
drawerLayout.setScrimColor(Color.TRANSPARENT);
}
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
if (landscape && landscape3 &&
config.orientation == Configuration.ORIENTATION_LANDSCAPE)
childContent.setPaddingRelative(
Math.round(slideOffset * childDrawer.getLayoutParams().width), 0, 0, 0);
}
};
drawerLayout.addDrawerListener(drawerToggle);
@ -262,7 +289,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
final NavMenuItem navOperations = new NavMenuItem(R.drawable.baseline_dns_24, R.string.menu_operations, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuOperations();
}
});
@ -272,7 +300,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
menus.add(new NavMenuItem(R.drawable.baseline_list_24, R.string.title_log, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onShowLog();
}
}));
@ -280,7 +309,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
menus.add(new NavMenuItem(R.drawable.baseline_reply_24, R.string.menu_answers, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuAnswers();
}
}));
@ -288,7 +318,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
menus.add(new NavMenuItem(R.drawable.baseline_settings_applications_24, R.string.menu_setup, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuSetup();
}
}));
@ -302,7 +333,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_help_24, R.string.menu_legend, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuLegend();
}
}));
@ -310,13 +342,15 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_question_answer_24, R.string.menu_faq, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuFAQ();
}
}, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onDebugInfo();
}
}).setExternal(true));
@ -325,7 +359,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_feedback_24, R.string.menu_issue, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuIssue();
}
}).setExternal(true));
@ -334,7 +369,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_bug_report_24, R.string.menu_test, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuTest();
}
}).setExternal(true));
@ -342,7 +378,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_account_box_24, R.string.menu_privacy, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuPrivacy();
}
}));
@ -356,7 +393,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
@Override
public void run() {
if (!Helper.isPlayStoreInstall()) {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
checkUpdate(true);
}
}
@ -365,7 +403,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_monetization_on_24, R.string.menu_pro, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
startActivity(new Intent(ActivityView.this, ActivityBilling.class));
}
}));
@ -374,7 +413,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_people_24, R.string.menu_invite, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuInvite();
}
}).setExternal(true));
@ -384,7 +424,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_star_24, R.string.menu_rate, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuRate();
}
}).setExternal(true));
@ -393,7 +434,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
extra.add(new NavMenuItem(R.drawable.baseline_get_app_24, R.string.menu_other, new Runnable() {
@Override
public void run() {
drawerLayout.closeDrawer(drawerContainer);
if (!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
onMenuOtherApps();
}
}).setExternal(true));
@ -546,10 +588,11 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(drawerContainer))
int count = getSupportFragmentManager().getBackStackEntryCount();
if (drawerLayout.isDrawerOpen(drawerContainer) &&
!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
else {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (exit || count > 1)
super.onBackPressed();
else if (!backHandled()) {
@ -577,7 +620,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
if (count == 0)
finish();
else {
if (drawerLayout.isDrawerOpen(drawerContainer))
if (drawerLayout.isDrawerOpen(drawerContainer) &&
!drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
drawerToggle.setDrawerIndicatorEnabled(count == 1);
@ -591,8 +635,12 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item))
if (drawerToggle.onOptionsItemSelected(item)) {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count == 1 && drawerLayout.isLocked(drawerContainer))
drawerLayout.closeDrawer(drawerContainer);
return true;
}
return super.onOptionsItemSelected(item);
}

View File

@ -20,24 +20,17 @@ package eu.faircode.email;
*/
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.preference.PreferenceManager;
public class DrawerLayoutEx extends DrawerLayout {
private boolean locked = false;
public DrawerLayoutEx(@NonNull Context context) {
super(context);
}
@ -52,32 +45,14 @@ public class DrawerLayoutEx extends DrawerLayout {
void setup(Configuration config, View drawerContainer) {
setScrimColor(Helper.resolveColor(getContext(), R.attr.colorDrawerScrim));
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
boolean landscape = prefs.getBoolean("landscape", true);
boolean landscape3 = prefs.getBoolean("landscape3", false);
if (landscape && landscape3) {
ViewGroup childContent = (ViewGroup) getChildAt(0);
ViewGroup childDrawer = (ViewGroup) getChildAt(1);
if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
locked = true;
setDrawerLockMode(LOCK_MODE_LOCKED_OPEN);
setScrimColor(Color.TRANSPARENT);
childContent.setPaddingRelative(childDrawer.getLayoutParams().width, 0, 0, 0);
} else {
locked = false;
setDrawerLockMode(LOCK_MODE_UNLOCKED);
setScrimColor(Helper.resolveColor(getContext(), R.attr.colorDrawerScrim));
childContent.setPaddingRelative(0, 0, 0, 0);
closeDrawer(drawerContainer, false);
}
if (config.orientation != Configuration.ORIENTATION_LANDSCAPE) {
setDrawerLockMode(LOCK_MODE_UNLOCKED);
closeDrawer(drawerContainer, false);
}
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
super.onRestoreInstanceState(state);
locked = isLocked();
public boolean isLocked(View view) {
return (getDrawerLockMode(view) != LOCK_MODE_UNLOCKED);
}
public boolean isLocked() {
@ -85,24 +60,8 @@ public class DrawerLayoutEx extends DrawerLayout {
getDrawerLockMode(Gravity.RIGHT) == LOCK_MODE_LOCKED_OPEN);
}
@Override
public boolean isDrawerOpen(@NonNull View drawer) {
return (!locked && super.isDrawerOpen(drawer));
}
@Override
public boolean isDrawerOpen(int drawerGravity) {
return (!locked && super.isDrawerOpen(drawerGravity));
}
@Override
public boolean onInterceptTouchEvent(final MotionEvent ev) {
return (!locked && super.onInterceptTouchEvent(ev));
}
@Override
public void closeDrawer(@NonNull View drawerView) {
if (!locked)
super.closeDrawer(drawerView);
return (!isLocked() && super.onInterceptTouchEvent(ev));
}
}

View File

@ -569,7 +569,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer
swLandscape.setChecked(prefs.getBoolean("landscape", true));
swLandscape.setEnabled(normal);
swLandscape3.setChecked(prefs.getBoolean("landscape3", false));
swLandscape3.setChecked(prefs.getBoolean("landscape3", true));
swLandscape3.setEnabled(normal && swLandscape.isChecked());
String startup = prefs.getString("startup", "unified");

View File

@ -263,7 +263,7 @@
<string name="title_advanced_manage_connectivity">Manage connectivity</string>
<string name="title_advanced_landscape">Use two columns in landscape mode</string>
<string name="title_advanced_landscape3">Always show navigation menu in landscape mode</string>
<string name="title_advanced_landscape3">Allow fixed navigation menu in landscape mode</string>
<string name="title_advanced_startup">Show on start screen</string>
<string name="title_advanced_cards">Show cards</string>
<string name="title_advanced_date_header">Group by date</string>