Skip to content
This repository has been archived by the owner on Jun 1, 2023. It is now read-only.

Introduce back stack, simplify WelcomeActivity and fix a few issues #396

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,12 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
return v;
}

@Override
public void onResume() {
super.onResume();
getActivity().setTitle(R.string.nav_item_download);
}

@Override
public void onDestroyView() {
super.onDestroyView();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ public void onClick(View v) {
return v;
}

@Override
public void onResume() {
super.onResume();
getActivity().setTitle(R.string.nav_item_logs);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_logs, menu);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,12 @@ public void onActivityCreated(Bundle savedInstanceState) {
setHasOptionsMenu(true);
}

@Override
public void onResume() {
super.onResume();
getActivity().setTitle(R.string.nav_item_modules);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO maybe enable again after checking the implementation
Expand Down
228 changes: 94 additions & 134 deletions app/src/main/java/de/robv/android/xposed/installer/WelcomeActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,16 @@
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.LinearLayout;

import de.robv.android.xposed.installer.installation.StatusInstallerFragment;
import de.robv.android.xposed.installer.util.Loader;
Expand All @@ -29,15 +25,14 @@
import de.robv.android.xposed.installer.util.ThemeUtil;

public class WelcomeActivity extends XposedBaseActivity implements NavigationView.OnNavigationItemSelectedListener,
ModuleListener, Loader.Listener<RepoLoader> {
DrawerLayout.DrawerListener, ModuleListener, Loader.Listener<RepoLoader> {

private static final String SELECTED_ITEM_ID = "SELECTED_ITEM_ID";
private final Handler mDrawerHandler = new Handler();
private RepoLoader mRepoLoader;
private DrawerLayout mDrawerLayout;
private int mPrevSelectedId;
private NavigationView mNavigationView;
private int mSelectedId;
private Fragment fragmentToOpen;
private Class activityToOpen;
private int currItemId;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -46,57 +41,27 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_welcome);

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
assert mNavigationView != null;
mNavigationView.setNavigationItemSelectedListener(this);

ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this,
mDrawerLayout, toolbar, R.string.navigation_drawer_open,
R.string.navigation_drawer_close) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state
}
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
ActionBar ab = getSupportActionBar();
if (ab != null) {
ab.setDisplayHomeAsUpEnabled(true);
ab.setHomeAsUpIndicator(R.drawable.ic_menu);
}

@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, 0); // this disables the animation
}
};
mDrawerLayout.addDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
mDrawerLayout.addDrawerListener(this);
mNavigationView.setNavigationItemSelectedListener(this);

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
mSelectedId = mNavigationView.getMenu().getItem(prefs.getInt("default_view", 0)).getItemId();
mSelectedId = savedInstanceState == null ? mSelectedId : savedInstanceState.getInt(SELECTED_ITEM_ID);
mPrevSelectedId = mSelectedId;
mNavigationView.getMenu().findItem(mSelectedId).setChecked(true);

if (savedInstanceState == null) {
mDrawerHandler.removeCallbacksAndMessages(null);
mDrawerHandler.postDelayed(new Runnable() {
@Override
public void run() {
navigate(mSelectedId);
}
}, 250);

boolean openDrawer = prefs.getBoolean("open_drawer", false);

if (openDrawer)
mDrawerLayout.openDrawer(GravityCompat.START);
else
mDrawerLayout.closeDrawers();
}

int defaultViewId = prefs.getInt("default_view", 0);
Bundle extras = getIntent().getExtras();

if (extras != null) {
int value = extras.getInt("fragment", prefs.getInt("default_view", 0));
switchFragment(value);
int intentViewId = extras.getInt("fragment", defaultViewId);
switchFragment(intentViewId);
} else if (savedInstanceState == null) {
switchFragment(defaultViewId);
}

mRepoLoader = RepoLoader.getInstance();
Expand All @@ -106,108 +71,77 @@ public void run() {
notifyDataSetChanged();
}

public void switchFragment(int itemId) {
mSelectedId = mNavigationView.getMenu().getItem(itemId).getItemId();
mNavigationView.getMenu().findItem(mSelectedId).setChecked(true);
mDrawerHandler.removeCallbacksAndMessages(null);
mDrawerHandler.postDelayed(new Runnable() {
@Override
public void run() {
navigate(mSelectedId);
}
}, 250);
mDrawerLayout.closeDrawers();
public void switchFragment(int menuItemIdx) {
int itemId = mNavigationView.getMenu().getItem(menuItemIdx).getItemId();
prepareNavigation(itemId);
navigate();
mNavigationView.getMenu().findItem(itemId).setChecked(true);
}

private void navigate(final int itemId) {
final View elevation = findViewById(R.id.elevation);
Fragment navFragment = null;
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
// True selects menu item, false doesn't
return prepareNavigation(menuItem.getItemId());
}

@Override
public void onDrawerClosed(View drawerView) {
navigate();
}

private boolean prepareNavigation(int itemId) {
switch (itemId) {
case R.id.nav_item_framework:
mPrevSelectedId = itemId;
setTitle(R.string.app_name);
navFragment = new StatusInstallerFragment();
fragmentToOpen = new StatusInstallerFragment();
break;
case R.id.nav_item_modules:
mPrevSelectedId = itemId;
setTitle(R.string.nav_item_modules);
navFragment = new ModulesFragment();
fragmentToOpen = new ModulesFragment();
break;
case R.id.nav_item_downloads:
mPrevSelectedId = itemId;
setTitle(R.string.nav_item_download);
navFragment = new DownloadFragment();
fragmentToOpen = new DownloadFragment();
break;
case R.id.nav_item_logs:
mPrevSelectedId = itemId;
setTitle(R.string.nav_item_logs);
navFragment = new LogsFragment();
fragmentToOpen = new LogsFragment();
break;
case R.id.nav_item_settings:
startActivity(new Intent(this, SettingsActivity.class));
mNavigationView.getMenu().findItem(mPrevSelectedId).setChecked(true);
return;
activityToOpen = SettingsActivity.class;
break;
case R.id.nav_item_support:
startActivity(new Intent(this, SupportActivity.class));
mNavigationView.getMenu().findItem(mPrevSelectedId).setChecked(true);
return;
activityToOpen = SupportActivity.class;
break;
case R.id.nav_item_about:
startActivity(new Intent(this, AboutActivity.class));
mNavigationView.getMenu().findItem(mPrevSelectedId).setChecked(true);
return;
activityToOpen = AboutActivity.class;
}

final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp(4));
if (activityToOpen == null)
currItemId = itemId;

if (navFragment != null) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.animator.fade_in, R.animator.fade_out);
try {
transaction.replace(R.id.content_frame, navFragment).commit();

if (elevation != null) {
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
elevation.setLayoutParams(params);
}
};
a.setDuration(150);
elevation.startAnimation(a);
}
} catch (IllegalStateException ignored) {
}
}
mDrawerLayout.closeDrawers();

// Returns true if Fragment, false if Activity
return (activityToOpen == null);
}

public int dp(float value) {
float density = getApplicationContext().getResources().getDisplayMetrics().density;
private void navigate() {
if (fragmentToOpen != null) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();

if (value == 0) {
return 0;
if (getFragmentManager().findFragmentById(R.id.content_frame) != null) {
transaction.replace(R.id.content_frame, fragmentToOpen, String.valueOf(currItemId))
.addToBackStack(null)
.commit();
} else {
transaction.add(R.id.content_frame, fragmentToOpen, String.valueOf(currItemId))
.commit();
}
}
return (int) Math.ceil(density * value);
}

@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
mSelectedId = menuItem.getItemId();
mDrawerHandler.removeCallbacksAndMessages(null);
mDrawerHandler.postDelayed(new Runnable() {
@Override
public void run() {
navigate(mSelectedId);
}
}, 250);
mDrawerLayout.closeDrawers();
return true;
}
if (activityToOpen != null) {
startActivity(new Intent(this, activityToOpen));
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(SELECTED_ITEM_ID, mSelectedId);
activityToOpen = null;
fragmentToOpen = null;
}

@Override
Expand All @@ -216,6 +150,23 @@ public void onBackPressed() {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
// Reselect previous menu items when navigating through the back stack
mNavigationView.getMenu()
.findItem(Integer.parseInt(getFragmentManager().findFragmentById(R.id.content_frame).getTag()))
.setChecked(true);
}
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// Open the navigation drawer if the hamburger button was clicked
mDrawerLayout.openDrawer(GravityCompat.START);
return true;

default:
return super.onOptionsItemSelected(item);
}
}

Expand Down Expand Up @@ -264,4 +215,13 @@ protected void onDestroy() {
ModuleUtil.getInstance().removeListener(this);
mRepoLoader.removeListener(this);
}

@Override
public void onDrawerSlide(View drawerView, float slideOffset) {}

@Override
public void onDrawerOpened(View drawerView) {}

@Override
public void onDrawerStateChanged(int newState) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
@Override
public void onResume() {
super.onResume();
getActivity().setTitle(R.string.app_name);
refreshInstallStatus();
}

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/drawable-anydpi/ic_cloud.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:fillColor="#757575"
android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h0.71C7.37,7.69 9.48,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3s-1.34,3 -3,3z"/>
</vector>
2 changes: 1 addition & 1 deletion app/src/main/res/drawable-anydpi/ic_cloud_download.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
android:viewportHeight="24.0">
<path
android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h0.71C7.37,7.69 9.48,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3s-1.34,3 -3,3zM17,12.5l-5,5 -5,-5h3V8.5h4v4h3z"
android:fillColor="#000000"/>
android:fillColor="#757575"/>
</vector>
2 changes: 1 addition & 1 deletion app/src/main/res/drawable-anydpi/ic_cloud_off.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:fillColor="#757575"
android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4c-1.48,0 -2.85,0.43 -4.01,1.17l1.46,1.46C10.21,6.23 11.08,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3 0,1.13 -0.64,2.11 -1.56,2.62l1.45,1.45C23.16,18.16 24,16.68 24,15c0,-2.64 -2.05,-4.78 -4.65,-4.96zM3,5.27l2.75,2.74C2.56,8.15 0,10.77 0,14c0,3.31 2.69,6 6,6h11.73l2,2L21,20.73 4.27,4 3,5.27zM7.73,10l8,8H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h1.73z"/>
</vector>
9 changes: 9 additions & 0 deletions app/src/main/res/drawable-anydpi/ic_menu.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#ffffff"
android:pathData="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" />
</vector>
Loading