diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java index 4e4c10052..f1aafa422 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java @@ -16,32 +16,41 @@ import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.Adapter; import android.widget.AdapterView; +import android.widget.RelativeLayout; import java.util.ArrayList; -import java.util.Locale; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.HandlerService; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.AuthenticatedActivity; +import fr.free.nrw.commons.hamburger.HamburgerMenuContainer; +import fr.free.nrw.commons.hamburger.NavigationBaseFragment; import fr.free.nrw.commons.media.MediaDetailPagerFragment; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.upload.UploadService; +import fr.free.nrw.commons.utils.FragmentUtils; import timber.log.Timber; +import static android.support.v4.view.GravityCompat.START; + public class ContributionsActivity extends AuthenticatedActivity implements LoaderManager.LoaderCallbacks, AdapterView.OnItemClickListener, MediaDetailPagerFragment.MediaDetailProvider, FragmentManager.OnBackStackChangedListener, - ContributionsListFragment.SourceRefresher { + ContributionsListFragment.SourceRefresher, + HamburgerMenuContainer { private Cursor allContributions; private ContributionsListFragment contributionsList; @@ -50,6 +59,10 @@ public class ContributionsActivity private boolean isUploadServiceConnected; private ArrayList observersWaitingForLoad = new ArrayList<>(); private String CONTRIBUTION_SELECTION = ""; + + private DrawerLayout drawerLayout; + private RelativeLayout drawerPane; + /* This sorts in the following order: Currently Uploading @@ -119,9 +132,10 @@ public class ContributionsActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setTitle(R.string.title_activity_contributions); setContentView(R.layout.activity_contributions); + initSubviews(); + // Activity can call methods in the fragment by acquiring a reference to the Fragment from FragmentManager, using findFragmentById() contributionsList = (ContributionsListFragment)getSupportFragmentManager().findFragmentById(R.id.contributionsListFragment); @@ -136,6 +150,24 @@ public class ContributionsActivity } } requestAuthToken(); + NavigationBaseFragment baseFragment = new NavigationBaseFragment(); + baseFragment.setDrawerLayout(drawerLayout, drawerPane); + FragmentUtils.addAndCommitFragmentWithImmediateExecution(getSupportFragmentManager(), + R.id.drawer_fragment, + baseFragment); + } + + private void initSubviews() { + drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + drawerPane = (RelativeLayout) findViewById(R.id.drawer_pane); + setDrawerPaneWidth(); + } + + private void setDrawerPaneWidth() { + ViewGroup.LayoutParams params = drawerPane.getLayoutParams(); + // set width to lowerBound of 80% of the screen size + params.width = (getResources().getDisplayMetrics().widthPixels * 80) / 100; + drawerPane.setLayoutParams(params); } @Override @@ -229,15 +261,15 @@ public class ContributionsActivity ((CursorAdapter)contributionsList.getAdapter()).swapCursor(cursor); } - if (cursor.getCount() == 0 - && Locale.getDefault().getISO3Language().equals(Locale.ENGLISH.getISO3Language())) { - //cursor count is zero and language is english - - // we need to set the message for 0 case explicitly. - getSupportActionBar().setSubtitle(getResources() - .getString(R.string.contributions_subtitle_zero)); - } else { - getSupportActionBar().setSubtitle(getResources().getQuantityString(R.plurals.contributions_subtitle, cursor.getCount(), cursor.getCount())); - } +// if (cursor.getCount() == 0 +// && Locale.getDefault().getISO3Language().equals(Locale.ENGLISH.getISO3Language())) { +// //cursor count is zero and language is english - +// // we need to set the message for 0 case explicitly. +// getSupportActionBar().setSubtitle(getResources() +// .getString(R.string.contributions_subtitle_zero)); +// } else { +// getSupportActionBar().setSubtitle(getResources().getQuantityString(R.plurals.contributions_subtitle, cursor.getCount(), cursor.getCount())); +// } contributionsList.clearSyncMessage(); notifyAndMigrateDataSetObservers(); @@ -320,4 +352,23 @@ public class ContributionsActivity public void refreshSource() { getSupportLoaderManager().restartLoader(0, null, this); } + + @Override + public void setDrawerListener(ActionBarDrawerToggle listener) { + drawerLayout.setDrawerListener(listener); + } + + @Override + public void toggleDrawer() { + if (drawerLayout.isDrawerVisible(START)) { + drawerLayout.closeDrawer(START); + } else { + drawerLayout.openDrawer(START); + } + } + + @Override + public boolean isDrawerVisible() { + return drawerLayout.isDrawerVisible(START); + } } diff --git a/app/src/main/java/fr/free/nrw/commons/hamburger/HamburgerMenuContainer.java b/app/src/main/java/fr/free/nrw/commons/hamburger/HamburgerMenuContainer.java new file mode 100644 index 000000000..677200b54 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/hamburger/HamburgerMenuContainer.java @@ -0,0 +1,9 @@ +package fr.free.nrw.commons.hamburger; + +import android.support.v7.app.ActionBarDrawerToggle; + +public interface HamburgerMenuContainer { + void setDrawerListener(ActionBarDrawerToggle listener); + void toggleDrawer(); + boolean isDrawerVisible(); +} diff --git a/app/src/main/java/fr/free/nrw/commons/hamburger/NavigationBaseFragment.java b/app/src/main/java/fr/free/nrw/commons/hamburger/NavigationBaseFragment.java new file mode 100644 index 000000000..2f6d9dc8a --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/hamburger/NavigationBaseFragment.java @@ -0,0 +1,80 @@ +package fr.free.nrw.commons.hamburger; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import fr.free.nrw.commons.R; + + +public class NavigationBaseFragment extends Fragment { + @BindView(R.id.home_item) + TextView homeItem; + + @BindView(R.id.upload_item) + TextView uploadItem; + + @BindView(R.id.nearby_item) + TextView nearbyItem; + + @BindView(R.id.about_item) + TextView aboutItem; + + @BindView(R.id.settings_item) + TextView settingsItem; + + @BindView(R.id.feedback_item) + TextView feedbackItem; + + @BindView(R.id.logout_item) + TextView logoutItem; + + private DrawerLayout drawerLayout; + private RelativeLayout drawerPane; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View hamburgerView = inflater.inflate(R.layout.navigation_drawer_menu, container, false); + ButterKnife.bind(this, hamburgerView); + setupHamburgerMenu(); + return hamburgerView; + } + + @Override + public void onResume() { + super.onResume(); + } + + private void setupHamburgerMenu() { + ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(getActivity(), + drawerLayout, R.string.ok, R.string.cancel); + if (getActivity() instanceof HamburgerMenuContainer) { + ((HamburgerMenuContainer) getActivity()).setDrawerListener(drawerToggle); + } + } + + @OnClick(R.id.home_item) + protected void onProfileLayoutClick() { + closeDrawer(); + } + + private void closeDrawer() { + if (drawerLayout != null) { + drawerLayout.closeDrawer(drawerPane); + } + } + + public void setDrawerLayout(DrawerLayout drawerLayout, RelativeLayout drawerPane) { + this.drawerLayout = drawerLayout; + this.drawerPane = drawerPane; + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java index b0be190a4..62f0d2767 100644 --- a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java @@ -3,14 +3,19 @@ package fr.free.nrw.commons.theme; import android.content.Intent; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AppCompatActivity; +import android.widget.RelativeLayout; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.hamburger.NavigationBaseFragment; +import fr.free.nrw.commons.utils.FragmentUtils; public class BaseActivity extends AppCompatActivity { boolean currentTheme; + @Override protected void onCreate(Bundle savedInstanceState) { if(Utils.isDarkTheme(this)){ diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java new file mode 100644 index 000000000..d1935a5e6 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java @@ -0,0 +1,5 @@ +package fr.free.nrw.commons.theme; + +public class NavigationBaseActivity extends BaseActivity { + +} diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java new file mode 100644 index 000000000..aa79513e8 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java @@ -0,0 +1,31 @@ +package fr.free.nrw.commons.utils; + +import android.support.annotation.IdRes; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; + +import timber.log.Timber; + +public class FragmentUtils { + + public static boolean addAndCommitFragmentWithImmediateExecution( + @NonNull FragmentManager fragmentManager, + @IdRes int containerViewId, + @NonNull Fragment fragment) { + if (fragment.isAdded()) { + Timber.w("Could not add fragment. The fragment is already added."); + return false; + } + try { + fragmentManager.beginTransaction() + .add(containerViewId, fragment) + .commitNow(); + return true; + } catch (IllegalStateException e) { + Timber.e(e, "Could not add & commit fragment. " + + "Did you mean to call commitAllowingStateLoss?"); + } + return false; + } +} diff --git a/app/src/main/res/layout/activity_contributions.xml b/app/src/main/res/layout/activity_contributions.xml index e980662d3..103ba6621 100644 --- a/app/src/main/res/layout/activity_contributions.xml +++ b/app/src/main/res/layout/activity_contributions.xml @@ -1,17 +1,37 @@ - + android:layout_height="match_parent"> - + android:id="@+id/contributionsFragmentContainer" + android:orientation="horizontal"> - \ No newline at end of file + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/navigation_drawer_menu.xml b/app/src/main/res/layout/navigation_drawer_menu.xml new file mode 100644 index 000000000..f31aad9eb --- /dev/null +++ b/app/src/main/res/layout/navigation_drawer_menu.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 60fbe173d..2bb26325d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -184,4 +184,12 @@ Tap this message (or hit back) to skip this step. Set Recent Upload Limit Two factor authentication is currently not supported. + Cancel + Home + Upload + Nearby + About + Settings + Feedback + Logout diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 39fa1e4c4..a49b7b163 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,6 +1,6 @@ - -