From 10715f7acee9620e8a27b62f1600ee4bcbae1ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 9 Jan 2014 17:02:49 +0100 Subject: add experimental drawer navigation --- .../service/remote/AppSettingsFragment.java | 19 +- .../keychain/ui/DrawerActivity.java | 444 +++++++++++++++++++++ .../keychain/ui/KeyActivity.java | 3 +- .../keychain/ui/KeyListPublicActivity.java | 11 +- 4 files changed, 459 insertions(+), 18 deletions(-) create mode 100644 OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/DrawerActivity.java (limited to 'OpenPGP-Keychain/src/org/sufficientlysecure') diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/remote/AppSettingsFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/remote/AppSettingsFragment.java index e592f5d57..bb6e427a4 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/remote/AppSettingsFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/service/remote/AppSettingsFragment.java @@ -49,12 +49,13 @@ import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; +import com.beardedhen.androidbootstrap.BootstrapButton; + public class AppSettingsFragment extends Fragment { // model @@ -62,12 +63,12 @@ public class AppSettingsFragment extends Fragment { // view private LinearLayout mAdvancedSettingsContainer; - private Button mAdvancedSettingsButton; + private BootstrapButton mAdvancedSettingsButton; private TextView mAppNameView; private ImageView mAppIconView; private TextView mKeyUserId; private TextView mKeyUserIdRest; - private Button mSelectKeyButton; + private BootstrapButton mSelectKeyButton; private Spinner mEncryptionAlgorithm; private Spinner mHashAlgorithm; private Spinner mCompression; @@ -116,7 +117,8 @@ public class AppSettingsFragment extends Fragment { } private void initView(View view) { - mAdvancedSettingsButton = (Button) view.findViewById(R.id.api_app_settings_advanced_button); + mAdvancedSettingsButton = (BootstrapButton) view + .findViewById(R.id.api_app_settings_advanced_button); mAdvancedSettingsContainer = (LinearLayout) view .findViewById(R.id.api_app_settings_advanced); @@ -124,7 +126,8 @@ public class AppSettingsFragment extends Fragment { mAppIconView = (ImageView) view.findViewById(R.id.api_app_settings_app_icon); mKeyUserId = (TextView) view.findViewById(R.id.api_app_settings_user_id); mKeyUserIdRest = (TextView) view.findViewById(R.id.api_app_settings_user_id_rest); - mSelectKeyButton = (Button) view.findViewById(R.id.api_app_settings_select_key_button); + mSelectKeyButton = (BootstrapButton) view + .findViewById(R.id.api_app_settings_select_key_button); mEncryptionAlgorithm = (Spinner) view .findViewById(R.id.api_app_settings_encryption_algorithm); mHashAlgorithm = (Spinner) view.findViewById(R.id.api_app_settings_hash_algorithm); @@ -204,11 +207,13 @@ public class AppSettingsFragment extends Fragment { if (mAdvancedSettingsContainer.getVisibility() == View.VISIBLE) { mAdvancedSettingsContainer.startAnimation(invisibleAnimation); mAdvancedSettingsContainer.setVisibility(View.GONE); - mAdvancedSettingsButton.setText(R.string.api_settings_show_advanced); + mAdvancedSettingsButton.setText(getString(R.string.api_settings_show_advanced)); + mAdvancedSettingsButton.setLeftIcon("fa-caret-up"); } else { mAdvancedSettingsContainer.startAnimation(visibleAnimation); mAdvancedSettingsContainer.setVisibility(View.VISIBLE); - mAdvancedSettingsButton.setText(R.string.api_settings_hide_advanced); + mAdvancedSettingsButton.setText(getString(R.string.api_settings_hide_advanced)); + mAdvancedSettingsButton.setLeftIcon("fa-caret-down"); } } }); diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/DrawerActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/DrawerActivity.java new file mode 100644 index 000000000..e278af5e3 --- /dev/null +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/DrawerActivity.java @@ -0,0 +1,444 @@ +/* + * + * from https://github.com/tobykurien/SherlockNavigationDrawer + * + * Copyright 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sufficientlysecure.keychain.ui; + +import org.sufficientlysecure.keychain.R; + +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.view.ActionProvider; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.SubMenu; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import com.actionbarsherlock.app.SherlockFragmentActivity; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; + +/** + * This example illustrates a common usage of the DrawerLayout widget in the Android support + * library. + *

+ *

+ * When a navigation (left) drawer is present, the host activity should detect presses of the action + * bar's Up affordance as a signal to open and close the navigation drawer. The + * ActionBarDrawerToggle facilitates this behavior. Items within the drawer should fall into one of + * two categories: + *

+ *

+ *

+ *

+ *

+ * Right side drawers should be used for actions, not navigation. This follows the pattern + * established by the Action Bar that navigation should be to the left and actions to the right. An + * action should be an operation performed on the current contents of the window, for example + * enabling or disabling a data overlay on top of the current content. + *

+ */ +public class DrawerActivity extends SherlockFragmentActivity { + private DrawerLayout mDrawerLayout; + private ListView mDrawerList; + private ActionBarDrawerToggle mDrawerToggle; + + private CharSequence mDrawerTitle; + private CharSequence mTitle; + private String[] mDrawerTitles; + + protected void setupDrawerNavigation(Bundle savedInstanceState) { + // mTitle = mDrawerTitle = getTitle(); + mDrawerTitles = getResources().getStringArray(R.array.drawer_array); + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawerList = (ListView) findViewById(R.id.left_drawer); + + // set a custom shadow that overlays the main content when the drawer + // opens + mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + // set up the drawer's list view with items and click listener + mDrawerList.setAdapter(new ArrayAdapter(this, R.layout.drawer_list_item, + mDrawerTitles)); + mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); + + // enable ActionBar app icon to behave as action to toggle nav drawer + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + + // ActionBarDrawerToggle ties together the the proper interactions + // between the sliding drawer and the action bar app icon + mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */ + mDrawerLayout, /* DrawerLayout object */ + R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ + R.string.drawer_open, /* "open drawer" description for accessibility */ + R.string.drawer_close /* "close drawer" description for accessibility */ + ) { + public void onDrawerClosed(View view) { + getSupportActionBar().setTitle(mTitle); + supportInvalidateOptionsMenu(); // creates call to + // onPrepareOptionsMenu() + } + + public void onDrawerOpened(View drawerView) { + getSupportActionBar().setTitle(mDrawerTitle); + supportInvalidateOptionsMenu(); // creates call to + // onPrepareOptionsMenu() + } + }; + mDrawerLayout.setDrawerListener(mDrawerToggle); + + if (savedInstanceState == null) { + selectItem(0); + } + } + + /* Called whenever we call invalidateOptionsMenu() */ + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + // If the nav drawer is open, hide action items related to the content + // view + boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); + // menu.findItem(R.id.action_websearch).setVisible(!drawerOpen); + return super.onPrepareOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + // The action bar home/up action should open or close the drawer. + // ActionBarDrawerToggle will take care of this. + if (mDrawerToggle.onOptionsItemSelected(getMenuItem(item))) { + return true; + } + + // Handle action buttons + switch (item.getItemId()) { + // case R.id.action_websearch: + // // create intent to perform web search for this planet + // Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); + // intent.putExtra(SearchManager.QUERY, getSupportActionBar().getTitle()); + // // catch event that there's no activity to handle intent + // if (intent.resolveActivity(getPackageManager()) != null) { + // startActivity(intent); + // } else { + // Toast.makeText(this, R.string.app_not_available, Toast.LENGTH_LONG).show(); + // } + // return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private android.view.MenuItem getMenuItem(final MenuItem item) { + return new android.view.MenuItem() { + @Override + public int getItemId() { + return item.getItemId(); + } + + public boolean isEnabled() { + return true; + } + + @Override + public boolean collapseActionView() { + return false; + } + + @Override + public boolean expandActionView() { + return false; + } + + @Override + public ActionProvider getActionProvider() { + return null; + } + + @Override + public View getActionView() { + return null; + } + + @Override + public char getAlphabeticShortcut() { + return 0; + } + + @Override + public int getGroupId() { + return 0; + } + + @Override + public Drawable getIcon() { + return null; + } + + @Override + public Intent getIntent() { + return null; + } + + @Override + public ContextMenuInfo getMenuInfo() { + return null; + } + + @Override + public char getNumericShortcut() { + return 0; + } + + @Override + public int getOrder() { + return 0; + } + + @Override + public SubMenu getSubMenu() { + return null; + } + + @Override + public CharSequence getTitle() { + return null; + } + + @Override + public CharSequence getTitleCondensed() { + return null; + } + + @Override + public boolean hasSubMenu() { + return false; + } + + @Override + public boolean isActionViewExpanded() { + return false; + } + + @Override + public boolean isCheckable() { + return false; + } + + @Override + public boolean isChecked() { + return false; + } + + @Override + public boolean isVisible() { + return false; + } + + @Override + public android.view.MenuItem setActionProvider(ActionProvider actionProvider) { + return null; + } + + @Override + public android.view.MenuItem setActionView(View view) { + return null; + } + + @Override + public android.view.MenuItem setActionView(int resId) { + return null; + } + + @Override + public android.view.MenuItem setAlphabeticShortcut(char alphaChar) { + return null; + } + + @Override + public android.view.MenuItem setCheckable(boolean checkable) { + return null; + } + + @Override + public android.view.MenuItem setChecked(boolean checked) { + return null; + } + + @Override + public android.view.MenuItem setEnabled(boolean enabled) { + return null; + } + + @Override + public android.view.MenuItem setIcon(Drawable icon) { + return null; + } + + @Override + public android.view.MenuItem setIcon(int iconRes) { + return null; + } + + @Override + public android.view.MenuItem setIntent(Intent intent) { + return null; + } + + @Override + public android.view.MenuItem setNumericShortcut(char numericChar) { + return null; + } + + @Override + public android.view.MenuItem setOnActionExpandListener(OnActionExpandListener listener) { + return null; + } + + @Override + public android.view.MenuItem setOnMenuItemClickListener( + OnMenuItemClickListener menuItemClickListener) { + return null; + } + + @Override + public android.view.MenuItem setShortcut(char numericChar, char alphaChar) { + return null; + } + + @Override + public void setShowAsAction(int actionEnum) { + } + + @Override + public android.view.MenuItem setShowAsActionFlags(int actionEnum) { + return null; + } + + @Override + public android.view.MenuItem setTitle(CharSequence title) { + return null; + } + + @Override + public android.view.MenuItem setTitle(int title) { + return null; + } + + @Override + public android.view.MenuItem setTitleCondensed(CharSequence title) { + return null; + } + + @Override + public android.view.MenuItem setVisible(boolean visible) { + return null; + } + }; + } + + /* The click listner for ListView in the navigation drawer */ + private class DrawerItemClickListener implements ListView.OnItemClickListener { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + selectItem(position); + } + } + + private void selectItem(int position) { + // update the main content by replacing fragments + // Fragment fragment = new PlanetFragment(); + // Bundle args = new Bundle(); + // args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); + // fragment.setArguments(args); + + // FragmentManager fragmentManager = getSupportFragmentManager(); + // fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); + + // update selected item and title, then close the drawer + mDrawerList.setItemChecked(position, true); + // setTitle(mDrawerTitles[position]); + mDrawerLayout.closeDrawer(mDrawerList); + } + + // @Override + // public void setTitle(CharSequence title) { + // mTitle = title; + // getSupportActionBar().setTitle(mTitle); + // } + + /** + * When using the ActionBarDrawerToggle, you must call it during onPostCreate() and + * onConfigurationChanged()... + */ + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + mDrawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + // Pass any configuration change to the drawer toggles + mDrawerToggle.onConfigurationChanged(newConfig); + } + + /** + * Fragment that appears in the "content_frame", shows a planet + */ + // public static class PlanetFragment extends SherlockFragment { + // public static final String ARG_PLANET_NUMBER = "planet_number"; + // + // public PlanetFragment() { + // // Empty constructor required for fragment subclasses + // } + // + // @Override + // public View onCreateView(LayoutInflater inflater, ViewGroup container, + // Bundle savedInstanceState) { + // View rootView = inflater.inflate(R.layout.fragment_planet, container, false); + // int i = getArguments().getInt(ARG_PLANET_NUMBER); + // String planet = getResources().getStringArray(R.array.drawer_array)[i]; + // + // int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()), + // "drawable", getActivity().getPackageName()); + // ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId); + // getActivity().setTitle(planet); + // return rootView; + // } + // } +} \ No newline at end of file diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyActivity.java index 2760df97e..3766b1c42 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyActivity.java @@ -45,8 +45,7 @@ import com.actionbarsherlock.app.SherlockFragmentActivity; * TODO: get key type by looking at dataUri! * */ -public class KeyActivity extends SherlockFragmentActivity { - +public class KeyActivity extends DrawerActivity { protected FileDialogFragment mFileDialog; protected String mExportFilename; diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListPublicActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListPublicActivity.java index 023c8fd9d..476d3c96c 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListPublicActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListPublicActivity.java @@ -35,8 +35,8 @@ public class KeyListPublicActivity extends KeyActivity { setContentView(R.layout.key_list_public_activity); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setHomeButtonEnabled(true); + // now setup navigation drawer in DrawerActivity... + setupDrawerNavigation(savedInstanceState); } @Override @@ -49,13 +49,6 @@ public class KeyListPublicActivity extends KeyActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case android.R.id.home: - // app icon in Action Bar clicked; go home - Intent intent = new Intent(this, MainActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - - return true; case R.id.menu_key_list_public_import: Intent intentImportFromFile = new Intent(this, ImportKeysActivity.class); startActivityForResult(intentImportFromFile, Id.request.import_from_qr_code); -- cgit v1.2.3