diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 982682e035..e5532d439d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -32,11 +32,10 @@
android:icon="${appIcon}"
android:label="@string/app_name"
android:supportsRtl="true"
- android:theme="@style/AppTheme">
+ android:theme="@style/AppTheme.NoActionBar">
-
@@ -171,7 +170,10 @@
android:name=".setupwizard.SetupWizardActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/AppTheme.SetupWizard"
- android:label="@string/title_activity_setup_wizard">
+ android:label="@string/title_activity_setup_wizard" />
+
+
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java
index 9d869cdde6..538f51a82d 100644
--- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java
@@ -1,30 +1,35 @@
package info.nightscout.androidaps;
-import android.app.Activity;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Rect;
-import android.os.Build;
import android.os.Bundle;
+import android.os.PersistableBundle;
import android.os.PowerManager;
+import android.support.annotation.Nullable;
+import android.support.design.widget.NavigationView;
+import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.view.ViewPager;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.PopupMenu;
+import android.support.v7.widget.Toolbar;
import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
-import android.view.MenuInflater;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
-import android.widget.ImageButton;
+import android.widget.LinearLayout;
import android.widget.TextView;
import com.joanzapata.iconify.Iconify;
@@ -37,7 +42,6 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventFeatureRunning;
-import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
@@ -45,7 +49,6 @@ import info.nightscout.androidaps.plugins.Food.FoodPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.setupwizard.SetupWizardActivity;
-import info.nightscout.androidaps.tabs.SlidingTabLayout;
import info.nightscout.androidaps.tabs.TabPageAdapter;
import info.nightscout.utils.AndroidPermission;
import info.nightscout.utils.ImportExportPrefs;
@@ -55,13 +58,15 @@ import info.nightscout.utils.OKDialog;
import info.nightscout.utils.PasswordProtection;
import info.nightscout.utils.SP;
-public class MainActivity extends AppCompatActivity implements View.OnClickListener {
+public class MainActivity extends AppCompatActivity {
private static Logger log = LoggerFactory.getLogger(MainActivity.class);
- ImageButton menuButton;
-
protected PowerManager.WakeLock mWakeLock;
+ private ActionBarDrawerToggle actionBarDrawerToggle;
+
+ private MenuItem pluginPreferencesMenuItem;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -71,16 +76,54 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
Iconify.with(new FontAwesomeModule());
LocaleHelper.onCreate(this, "en");
+
setContentView(R.layout.activity_main);
- menuButton = (ImageButton) findViewById(R.id.overview_menuButton);
- menuButton.setOnClickListener(this);
+ setSupportActionBar(findViewById(R.id.toolbar));
+ getSupportActionBar().setDisplayShowTitleEnabled(false);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setHomeButtonEnabled(true);
+
+ DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
+ actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.open_navigation, R.string.close_navigation);
+ drawerLayout.addDrawerListener(actionBarDrawerToggle);
+ actionBarDrawerToggle.syncState();
onStatusEvent(new EventSetWakeLock(SP.getBoolean("lockscreen", false)));
doMigrations();
registerBus();
- setUpTabs(false);
+ setupTabs();
+ setupViews(false);
+
+ final ViewPager viewPager = findViewById(R.id.pager);
+ viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ checkPluginPreferences(viewPager);
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ }
+ });
+ }
+
+ private void checkPluginPreferences(ViewPager viewPager) {
+ if (pluginPreferencesMenuItem == null) return;
+ if (((TabPageAdapter) viewPager.getAdapter()).getPluginAt(viewPager.getCurrentItem()).getPreferencesId() != -1)
+ pluginPreferencesMenuItem.setEnabled(true);
+ else pluginPreferencesMenuItem.setEnabled(false);
+ }
+
+ @Override
+ public void onPostCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
+ super.onPostCreate(savedInstanceState, persistentState);
+ actionBarDrawerToggle.syncState();
}
@Override
@@ -127,39 +170,74 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
public void onStatusEvent(final EventRefreshGui ev) {
String lang = SP.getString("language", "en");
LocaleHelper.setLocale(getApplicationContext(), lang);
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- if (ev.recreate) {
- recreate();
- } else {
- try { // activity may be destroyed
- setUpTabs(true);
- } catch (IllegalStateException e) {
- log.error("Unhandled exception", e);
- }
+ runOnUiThread(() -> {
+ if (ev.recreate) {
+ recreate();
+ } else {
+ try { // activity may be destroyed
+ setupTabs();
+ setupViews(true);
+ } catch (IllegalStateException e) {
+ log.error("Unhandled exception", e);
}
-
- boolean lockScreen = BuildConfig.NSCLIENTOLNY && SP.getBoolean("lockscreen", false);
- if (lockScreen)
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- else
- getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
+
+ boolean lockScreen = BuildConfig.NSCLIENTOLNY && SP.getBoolean("lockscreen", false);
+ if (lockScreen)
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ else
+ getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
});
}
- private void setUpTabs(boolean switchToLast) {
+ private void setupViews(boolean switchToLast) {
TabPageAdapter pageAdapter = new TabPageAdapter(getSupportFragmentManager(), this);
+ NavigationView navigationView = findViewById(R.id.navigation_view);
+ navigationView.setNavigationItemSelectedListener(menuItem -> {
+ return true;
+ });
+ Menu menu = navigationView.getMenu();
+ menu.clear();
for (PluginBase p : MainApp.getPluginsList()) {
pageAdapter.registerNewFragment(p);
+ if (p.hasFragment() && !p.isFragmentVisible() && p.isEnabled(p.pluginDescription.getType())) {
+ MenuItem menuItem = menu.add(p.getName());
+ menuItem.setCheckable(true);
+ menuItem.setOnMenuItemClickListener(item -> {
+ Intent intent = new Intent(this, SingleFragmentActivity.class);
+ intent.putExtra("plugin", MainApp.getPluginsList().indexOf(p));
+ startActivity(intent);
+ return true;
+ });
+ }
}
- ViewPager mPager = (ViewPager) findViewById(R.id.pager);
+ ViewPager mPager = findViewById(R.id.pager);
mPager.setAdapter(pageAdapter);
- SlidingTabLayout mTabs = (SlidingTabLayout) findViewById(R.id.tabs);
- mTabs.setViewPager(mPager);
if (switchToLast)
mPager.setCurrentItem(pageAdapter.getCount() - 1, false);
+ checkPluginPreferences(mPager);
+ }
+
+ private void setupTabs() {
+ ViewPager viewPager = findViewById(R.id.pager);
+ TabLayout normalTabs = findViewById(R.id.tabs_normal);
+ normalTabs.setupWithViewPager(viewPager, true);
+ TabLayout compactTabs = findViewById(R.id.tabs_compact);
+ compactTabs.setupWithViewPager(viewPager, true);
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ if (SP.getBoolean("short_tabtitles", false)) {
+ normalTabs.setVisibility(View.GONE);
+ compactTabs.setVisibility(View.VISIBLE);
+ toolbar.setLayoutParams(new LinearLayout.LayoutParams(Toolbar.LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.compact_height)));
+ } else {
+ normalTabs.setVisibility(View.VISIBLE);
+ compactTabs.setVisibility(View.GONE);
+ TypedValue typedValue = new TypedValue();
+ if (getTheme().resolveAttribute(R.attr.actionBarSize, typedValue, true)) {
+ toolbar.setLayoutParams(new LinearLayout.LayoutParams(Toolbar.LayoutParams.MATCH_PARENT,
+ TypedValue.complexToDimensionPixelSize(typedValue.data, getResources().getDisplayMetrics())));
+ }
+ }
}
private void registerBus() {
@@ -257,99 +335,96 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
}
@Override
- public void onClick(final View v) {
- final Activity activity = this;
- switch (v.getId()) {
- case R.id.overview_menuButton:
- PopupMenu popup = new PopupMenu(v.getContext(), v);
- MenuInflater inflater = popup.getMenuInflater();
- inflater.inflate(R.menu.menu_main, popup.getMenu());
- popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- int id = item.getItemId();
- switch (id) {
- case R.id.nav_preferences:
- PasswordProtection.QueryPassword(v.getContext(), R.string.settings_password, "settings_password", new Runnable() {
- @Override
- public void run() {
- Intent i = new Intent(v.getContext(), PreferencesActivity.class);
- i.putExtra("id", -1);
- startActivity(i);
- }
- }, null);
- break;
- case R.id.nav_historybrowser:
- startActivity(new Intent(v.getContext(), HistoryBrowseActivity.class));
- break;
- case R.id.nav_setupwizard:
- startActivity(new Intent(v.getContext(), SetupWizardActivity.class));
- break;
- case R.id.nav_resetdb:
- new AlertDialog.Builder(v.getContext())
- .setTitle(R.string.nav_resetdb)
- .setMessage(R.string.reset_db_confirm)
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- MainApp.getDbHelper().resetDatabases();
- // should be handled by Plugin-Interface and
- // additional service interface and plugin registry
- FoodPlugin.getPlugin().getService().resetFood();
- TreatmentsPlugin.getPlugin().getService().resetTreatments();
- }
- })
- .create()
- .show();
- break;
- case R.id.nav_export:
- ImportExportPrefs.verifyStoragePermissions(activity);
- ImportExportPrefs.exportSharedPreferences(activity);
- break;
- case R.id.nav_import:
- ImportExportPrefs.verifyStoragePermissions(activity);
- ImportExportPrefs.importSharedPreferences(activity);
- break;
- case R.id.nav_show_logcat:
- LogDialog.showLogcat(v.getContext());
- break;
- case R.id.nav_about:
- AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
- builder.setTitle(MainApp.gs(R.string.app_name) + " " + BuildConfig.VERSION);
- if (Config.NSCLIENT || Config.G5UPLOADER)
- builder.setIcon(R.mipmap.yellowowl);
- else
- builder.setIcon(R.mipmap.blueowl);
- String message = "Build: " + BuildConfig.BUILDVERSION + "\n";
- message += "Flavor: " + BuildConfig.FLAVOR + BuildConfig.BUILD_TYPE + "\n";
- message += MainApp.gs(R.string.configbuilder_nightscoutversion_label) + " " + ConfigBuilderPlugin.nightscoutVersionName;
- if (MainApp.engineeringMode)
- message += "\n" + MainApp.gs(R.string.engineering_mode_enabled);
- message += MainApp.gs(R.string.about_link_urls);
- final SpannableString messageSpanned = new SpannableString(message);
- Linkify.addLinks(messageSpanned, Linkify.WEB_URLS);
- builder.setMessage(messageSpanned);
- builder.setPositiveButton(MainApp.gs(R.string.ok), null);
- AlertDialog alertDialog = builder.create();
- alertDialog.show();
- ((TextView) alertDialog.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
- break;
- case R.id.nav_exit:
- log.debug("Exiting");
- MainApp.instance().stopKeepAliveService();
- MainApp.bus().post(new EventAppExit());
- MainApp.closeDbHelper();
- finish();
- System.runFinalization();
- System.exit(0);
- break;
- }
- return false;
- }
- });
- popup.show();
- break;
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ pluginPreferencesMenuItem = menu.findItem(R.id.nav_plugin_preferences);
+ checkPluginPreferences(findViewById(R.id.pager));
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ switch (id) {
+ case R.id.nav_preferences:
+ PasswordProtection.QueryPassword(this, R.string.settings_password, "settings_password", () -> {
+ Intent i = new Intent(this, PreferencesActivity.class);
+ i.putExtra("id", -1);
+ startActivity(i);
+ }, null);
+ return true;
+ case R.id.nav_historybrowser:
+ startActivity(new Intent(this, HistoryBrowseActivity.class));
+ return true;
+ case R.id.nav_setupwizard:
+ startActivity(new Intent(this, SetupWizardActivity.class));
+ return true;
+ case R.id.nav_resetdb:
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.nav_resetdb)
+ .setMessage(R.string.reset_db_confirm)
+ .setNegativeButton(android.R.string.cancel, null)
+ .setPositiveButton(android.R.string.ok, (dialog, which) -> {
+ MainApp.getDbHelper().resetDatabases();
+ // should be handled by Plugin-Interface and
+ // additional service interface and plugin registry
+ FoodPlugin.getPlugin().getService().resetFood();
+ TreatmentsPlugin.getPlugin().getService().resetTreatments();
+ })
+ .create()
+ .show();
+ return true;
+ case R.id.nav_export:
+ ImportExportPrefs.verifyStoragePermissions(this);
+ ImportExportPrefs.exportSharedPreferences(this);
+ return true;
+ case R.id.nav_import:
+ ImportExportPrefs.verifyStoragePermissions(this);
+ ImportExportPrefs.importSharedPreferences(this);
+ return true;
+ case R.id.nav_show_logcat:
+ LogDialog.showLogcat(this);
+ return true;
+ case R.id.nav_about:
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(MainApp.gs(R.string.app_name) + " " + BuildConfig.VERSION);
+ if (Config.NSCLIENT || Config.G5UPLOADER)
+ builder.setIcon(R.mipmap.yellowowl);
+ else
+ builder.setIcon(R.mipmap.blueowl);
+ String message = "Build: " + BuildConfig.BUILDVERSION + "\n";
+ message += "Flavor: " + BuildConfig.FLAVOR + BuildConfig.BUILD_TYPE + "\n";
+ message += MainApp.gs(R.string.configbuilder_nightscoutversion_label) + " " + ConfigBuilderPlugin.nightscoutVersionName;
+ if (MainApp.engineeringMode)
+ message += "\n" + MainApp.gs(R.string.engineering_mode_enabled);
+ message += MainApp.gs(R.string.about_link_urls);
+ final SpannableString messageSpanned = new SpannableString(message);
+ Linkify.addLinks(messageSpanned, Linkify.WEB_URLS);
+ builder.setMessage(messageSpanned);
+ builder.setPositiveButton(MainApp.gs(R.string.ok), null);
+ AlertDialog alertDialog = builder.create();
+ alertDialog.show();
+ ((TextView) alertDialog.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
+ return true;
+ case R.id.nav_exit:
+ log.debug("Exiting");
+ MainApp.instance().stopKeepAliveService();
+ MainApp.bus().post(new EventAppExit());
+ MainApp.closeDbHelper();
+ finish();
+ System.runFinalization();
+ System.exit(0);
+ return true;
+ case R.id.nav_plugin_preferences:
+ ViewPager viewPager = findViewById(R.id.pager);
+ final PluginBase plugin = ((TabPageAdapter) viewPager.getAdapter()).getPluginAt(viewPager.getCurrentItem());
+ PasswordProtection.QueryPassword(this, R.string.settings_password, "settings_password", () -> {
+ Intent i = new Intent(this, PreferencesActivity.class);
+ i.putExtra("id", plugin.getPreferencesId());
+ startActivity(i);
+ }, null);
+ return true;
}
+ return actionBarDrawerToggle.onOptionsItemSelected(item);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/SingleFragmentActivity.java b/app/src/main/java/info/nightscout/androidaps/SingleFragmentActivity.java
new file mode 100644
index 0000000000..567799fe5e
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/SingleFragmentActivity.java
@@ -0,0 +1,59 @@
+package info.nightscout.androidaps;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import info.nightscout.androidaps.interfaces.PluginBase;
+import info.nightscout.androidaps.tabs.TabPageAdapter;
+import info.nightscout.utils.PasswordProtection;
+
+public class SingleFragmentActivity extends AppCompatActivity {
+
+ private PluginBase plugin;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_single_fragment);
+
+ this.plugin = MainApp.getPluginsList().get(getIntent().getIntExtra("plugin", -1));
+ setTitle(plugin.getName());
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setDisplayShowHomeEnabled(true);
+
+ if (savedInstanceState == null) {
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout,
+ Fragment.instantiate(this, plugin.pluginDescription.getFragmentClass())).commit();
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
+ }
+ else if (item.getItemId() == R.id.nav_plugin_preferences) {
+ PasswordProtection.QueryPassword(this, R.string.settings_password, "settings_password", () -> {
+ Intent i = new Intent(this, PreferencesActivity.class);
+ i.putExtra("id", plugin.getPreferencesId());
+ startActivity(i);
+ }, null);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ if (plugin.getPreferencesId() != -1)
+ getMenuInflater().inflate(R.menu.menu_single_fragment, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java
index 35130c5209..04e7dcdbfd 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java
@@ -87,9 +87,9 @@ public class ConfigBuilderPlugin extends PluginBase {
super(new PluginDescription()
.mainType(PluginType.GENERAL)
.fragmentClass(ConfigBuilderFragment.class.getName())
- .showInList(false)
+ .showInList(true)
.alwaysEnabled(true)
- .alwayVisible(true)
+ .alwayVisible(false)
.pluginName(R.string.configbuilder)
.shortName(R.string.configbuilder_shortname)
);
diff --git a/app/src/main/java/info/nightscout/androidaps/tabs/SlidingTabLayout.java b/app/src/main/java/info/nightscout/androidaps/tabs/SlidingTabLayout.java
deleted file mode 100644
index 80424a04f7..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/tabs/SlidingTabLayout.java
+++ /dev/null
@@ -1,322 +0,0 @@
-package info.nightscout.androidaps.tabs;/*
- * Copyright 2014 Google Inc. All rights reserved.
- *
- * 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.
- */
-
-import android.content.Context;
-import android.graphics.Typeface;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.util.AttributeSet;
-import android.util.SparseArray;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.HorizontalScrollView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import info.nightscout.androidaps.R;
-
-/**
- * To be used with ViewPager to provide a tab indicator component which give constant feedback as to
- * the user's scroll progress.
- *
- * To use the component, simply add it to your view hierarchy. Then in your
- * {@link android.app.Activity} or {@link android.support.v4.app.Fragment} call
- * {@link #setViewPager(ViewPager)} providing it the ViewPager this layout is being used for.
- *
- * The colors can be customized in two ways. The first and simplest is to provide an array of colors
- * via {@link #setSelectedIndicatorColors(int...)}. The
- * alternative is via the {@link TabColorizer} interface which provides you complete control over
- * which color is used for any individual position.
- *
- * The views used as tabs can be customized by calling {@link #setCustomTabView(int, int)},
- * providing the layout ID of your custom layout.
- */
-public class SlidingTabLayout extends HorizontalScrollView {
- /**
- * Allows complete control over the colors drawn in the tab layout. Set with
- * {@link #setCustomTabColorizer(TabColorizer)}.
- */
- public interface TabColorizer {
-
- /**
- * @return return the color of the indicator used when {@code position} is selected.
- */
- int getIndicatorColor(int position);
-
- }
-
- private static final int TITLE_OFFSET_DIPS = 24;
- private static final int TAB_VIEW_PADDING_DIPS = 9;
- private static final int TAB_VIEW_TEXT_SIZE_SP = 12;
-
- private int mTitleOffset;
-
- private int mTabViewLayoutId;
- private int mTabViewTextViewId;
- private boolean mDistributeEvenly;
-
- private ViewPager mViewPager;
- private SparseArray mContentDescriptions = new SparseArray();
- private ViewPager.OnPageChangeListener mViewPagerPageChangeListener;
-
- private final SlidingTabStrip mTabStrip;
-
- public SlidingTabLayout(Context context) {
- this(context, null);
- }
-
- public SlidingTabLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- // Disable the Scroll Bar
- setHorizontalScrollBarEnabled(false);
- // Make sure that the Tab Strips fills this View
- setFillViewport(true);
-
- mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density);
-
- mTabStrip = new SlidingTabStrip(context);
- addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
- setBackgroundColor(context.getResources().getColor(R.color.tabBgColor));
- }
-
- /**
- * Set the custom {@link TabColorizer} to be used.
- *
- * If you only require simple custmisation then you can use
- * {@link #setSelectedIndicatorColors(int...)} to achieve
- * similar effects.
- */
- public void setCustomTabColorizer(TabColorizer tabColorizer) {
- mTabStrip.setCustomTabColorizer(tabColorizer);
- }
-
- public void setDistributeEvenly(boolean distributeEvenly) {
- mDistributeEvenly = distributeEvenly;
- }
-
- /**
- * Sets the colors to be used for indicating the selected tab. These colors are treated as a
- * circular array. Providing one color will mean that all tabs are indicated with the same color.
- */
- public void setSelectedIndicatorColors(int... colors) {
- mTabStrip.setSelectedIndicatorColors(colors);
- }
-
- /**
- * Set the {@link ViewPager.OnPageChangeListener}. When using {@link SlidingTabLayout} you are
- * required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so
- * that the layout can update it's scroll position correctly.
- *
- * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener)
- */
- public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
- mViewPagerPageChangeListener = listener;
- }
-
- /**
- * Set the custom layout to be inflated for the tab views.
- *
- * @param layoutResId Layout id to be inflated
- * @param textViewId id of the {@link TextView} in the inflated view
- */
- public void setCustomTabView(int layoutResId, int textViewId) {
- mTabViewLayoutId = layoutResId;
- mTabViewTextViewId = textViewId;
- }
-
- /**
- * Sets the associated view pager. Note that the assumption here is that the pager content
- * (number of tabs and tab titles) does not change after this call has been made.
- */
- public void setViewPager(ViewPager viewPager) {
- mTabStrip.removeAllViews();
-
- mViewPager = viewPager;
- if (viewPager != null) {
- viewPager.setOnPageChangeListener(new InternalViewPagerListener());
- populateTabStrip();
- }
- }
-
- /**
- * Create a default view to be used for tabs. This is called if a custom tab view is not set via
- * {@link #setCustomTabView(int, int)}.
- */
- protected TextView createDefaultTabView(Context context) {
- TextView textView = new TextView(context);
- textView.setGravity(Gravity.CENTER);
- textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);
- textView.setTypeface(Typeface.DEFAULT_BOLD);
- textView.setLayoutParams(new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
-
- TypedValue outValue = new TypedValue();
- getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
- outValue, true);
- textView.setBackgroundResource(outValue.resourceId);
- textView.setAllCaps(true);
-
- int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
- textView.setPadding(padding, padding, padding, padding);
-
- return textView;
- }
-
- private void populateTabStrip() {
- final PagerAdapter adapter = mViewPager.getAdapter();
- final View.OnClickListener tabClickListener = new TabClickListener();
-
- for (int i = 0; i < adapter.getCount(); i++) {
- View tabView = null;
- TextView tabTitleView = null;
-
- if (mTabViewLayoutId != 0) {
- // If there is a custom tab view layout id set, try and inflate it
- tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip,
- false);
- tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId);
- }
-
- if (tabView == null) {
- tabView = createDefaultTabView(getContext());
- }
-
- if (tabTitleView == null && TextView.class.isInstance(tabView)) {
- tabTitleView = (TextView) tabView;
- }
-
- if (mDistributeEvenly) {
- LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tabView.getLayoutParams();
- lp.width = 0;
- lp.weight = 1;
- }
-
- tabTitleView.setText(adapter.getPageTitle(i));
- tabView.setOnClickListener(tabClickListener);
- String desc = mContentDescriptions.get(i, null);
- if (desc != null) {
- tabView.setContentDescription(desc);
- }
-
- mTabStrip.addView(tabView);
- if (i == mViewPager.getCurrentItem()) {
- tabView.setSelected(true);
- }
- }
- }
-
- public void setContentDescription(int i, String desc) {
- mContentDescriptions.put(i, desc);
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- if (mViewPager != null) {
- scrollToTab(mViewPager.getCurrentItem(), 0);
- }
- }
-
- private void scrollToTab(int tabIndex, int positionOffset) {
- final int tabStripChildCount = mTabStrip.getChildCount();
- if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {
- return;
- }
-
- View selectedChild = mTabStrip.getChildAt(tabIndex);
- if (selectedChild != null) {
- int targetScrollX = selectedChild.getLeft() + positionOffset;
-
- if (tabIndex > 0 || positionOffset > 0) {
- // If we're not at the first child and are mid-scroll, make sure we obey the offset
- targetScrollX -= mTitleOffset;
- }
-
- scrollTo(targetScrollX, 0);
- }
- }
-
- private class InternalViewPagerListener implements ViewPager.OnPageChangeListener {
- private int mScrollState;
-
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- int tabStripChildCount = mTabStrip.getChildCount();
- if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
- return;
- }
-
- mTabStrip.onViewPagerPageChanged(position, positionOffset);
-
- View selectedTitle = mTabStrip.getChildAt(position);
- int extraOffset = (selectedTitle != null)
- ? (int) (positionOffset * selectedTitle.getWidth())
- : 0;
- scrollToTab(position, extraOffset);
-
- if (mViewPagerPageChangeListener != null) {
- mViewPagerPageChangeListener.onPageScrolled(position, positionOffset,
- positionOffsetPixels);
- }
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
- mScrollState = state;
-
- if (mViewPagerPageChangeListener != null) {
- mViewPagerPageChangeListener.onPageScrollStateChanged(state);
- }
- }
-
- @Override
- public void onPageSelected(int position) {
- if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
- mTabStrip.onViewPagerPageChanged(position, 0f);
- scrollToTab(position, 0);
- }
- for (int i = 0; i < mTabStrip.getChildCount(); i++) {
- mTabStrip.getChildAt(i).setSelected(position == i);
- }
- if (mViewPagerPageChangeListener != null) {
- mViewPagerPageChangeListener.onPageSelected(position);
- }
- }
-
- }
-
- private class TabClickListener implements View.OnClickListener {
- @Override
- public void onClick(View v) {
- for (int i = 0; i < mTabStrip.getChildCount(); i++) {
- if (v == mTabStrip.getChildAt(i)) {
- mViewPager.setCurrentItem(i);
- return;
- }
- }
- }
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/tabs/SlidingTabStrip.java b/app/src/main/java/info/nightscout/androidaps/tabs/SlidingTabStrip.java
deleted file mode 100644
index 6c8e034477..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/tabs/SlidingTabStrip.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package info.nightscout.androidaps.tabs;/*
- * Copyright 2014 Google Inc. All rights reserved.
- *
- * 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.
- */
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
-
-class SlidingTabStrip extends LinearLayout {
-
- private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 0;
- private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26;
- private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 3;
-
- private final int mBottomBorderThickness;
- private final Paint mBottomBorderPaint;
-
- private final int mSelectedIndicatorThickness;
- private final Paint mSelectedIndicatorPaint;
-
- private int mSelectedPosition;
- private float mSelectionOffset;
-
- private SlidingTabLayout.TabColorizer mCustomTabColorizer;
- private final SimpleTabColorizer mDefaultTabColorizer;
-
- SlidingTabStrip(Context context) {
- this(context, null);
- }
-
- SlidingTabStrip(Context context, AttributeSet attrs) {
- super(context, attrs);
- setWillNotDraw(false);
-
- final float density = getResources().getDisplayMetrics().density;
-
- TypedValue outValue = new TypedValue();
- context.getTheme().resolveAttribute(android.R.attr.colorForeground, outValue, true);
- final int themeForegroundColor = outValue.data;
-
- int defaultBottomBorderColor = setColorAlpha(themeForegroundColor,
- DEFAULT_BOTTOM_BORDER_COLOR_ALPHA);
-
- mDefaultTabColorizer = new SimpleTabColorizer();
- mDefaultTabColorizer.setIndicatorColors(MainApp.gc(R.color.tabBgColorSelected));
-
- mBottomBorderThickness = (int) (DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density);
- mBottomBorderPaint = new Paint();
- mBottomBorderPaint.setColor(defaultBottomBorderColor);
-
- mSelectedIndicatorThickness = (int) (SELECTED_INDICATOR_THICKNESS_DIPS * density);
- mSelectedIndicatorPaint = new Paint();
- }
-
- void setCustomTabColorizer(SlidingTabLayout.TabColorizer customTabColorizer) {
- mCustomTabColorizer = customTabColorizer;
- invalidate();
- }
-
- void setSelectedIndicatorColors(int... colors) {
- // Make sure that the custom colorizer is removed
- mCustomTabColorizer = null;
- mDefaultTabColorizer.setIndicatorColors(colors);
- invalidate();
- }
-
- void onViewPagerPageChanged(int position, float positionOffset) {
- mSelectedPosition = position;
- mSelectionOffset = positionOffset;
- invalidate();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- final int height = getHeight();
- final int childCount = getChildCount();
- final SlidingTabLayout.TabColorizer tabColorizer = mCustomTabColorizer != null
- ? mCustomTabColorizer
- : mDefaultTabColorizer;
-
- // Thick colored underline below the current selection
- if (childCount > 0) {
- View selectedTitle = getChildAt(mSelectedPosition);
- int left = selectedTitle.getLeft();
- int right = selectedTitle.getRight();
- int color = tabColorizer.getIndicatorColor(mSelectedPosition);
-
- if (mSelectionOffset > 0f && mSelectedPosition < (getChildCount() - 1)) {
- int nextColor = tabColorizer.getIndicatorColor(mSelectedPosition + 1);
- if (color != nextColor) {
- color = blendColors(nextColor, color, mSelectionOffset);
- }
-
- // Draw the selection partway between the tabs
- View nextTitle = getChildAt(mSelectedPosition + 1);
- left = (int) (mSelectionOffset * nextTitle.getLeft() +
- (1.0f - mSelectionOffset) * left);
- right = (int) (mSelectionOffset * nextTitle.getRight() +
- (1.0f - mSelectionOffset) * right);
- }
-
- mSelectedIndicatorPaint.setColor(color);
-
- canvas.drawRect(left, height - mSelectedIndicatorThickness, right,
- height, mSelectedIndicatorPaint);
- }
-
- // Thin underline along the entire bottom edge
- canvas.drawRect(0, height - mBottomBorderThickness, getWidth(), height, mBottomBorderPaint);
- }
-
- /**
- * Set the alpha value of the {@code color} to be the given {@code alpha} value.
- */
- private static int setColorAlpha(int color, byte alpha) {
- return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));
- }
-
- /**
- * Blend {@code color1} and {@code color2} using the given ratio.
- *
- * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend,
- * 0.0 will return {@code color2}.
- */
- private static int blendColors(int color1, int color2, float ratio) {
- final float inverseRation = 1f - ratio;
- float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
- float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
- float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
- return Color.rgb((int) r, (int) g, (int) b);
- }
-
- private static class SimpleTabColorizer implements SlidingTabLayout.TabColorizer {
- private int[] mIndicatorColors;
-
- @Override
- public final int getIndicatorColor(int position) {
- return mIndicatorColors[position % mIndicatorColors.length];
- }
-
- void setIndicatorColors(int... colors) {
- mIndicatorColors = colors;
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java b/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java
index 8397da97aa..c17646e901 100644
--- a/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java
+++ b/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java
@@ -39,6 +39,10 @@ public class TabPageAdapter extends FragmentStatePagerAdapter {
return Fragment.instantiate(context, visibleFragmentList.get(position).pluginDescription.getFragmentClass());
}
+ public PluginBase getPluginAt(int position) {
+ return visibleFragmentList.get(position);
+ }
+
@Override
public void finishUpdate(ViewGroup container) {
try{
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 75b54a74cb..c0f382fbb8 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,46 +1,59 @@
-
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false">
-
+ android:layout_height="?attr/actionBarSize"
+ android:background="@color/colorPrimary"
+ app:contentInsetEndWithActions="48dp"
+ app:contentInsetStartWithNavigation="48dp"
+ android:elevation="4dp">
-
+ android:background="@android:color/transparent"
+ app:tabIndicatorColor="#FFFFFF"
+ app:tabMode="scrollable" />
+
+
-
+
-
+
-
+
+
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_single_fragment.xml b/app/src/main/res/layout/activity_single_fragment.xml
new file mode 100644
index 0000000000..76a157b15a
--- /dev/null
+++ b/app/src/main/res/layout/activity_single_fragment.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index d0fcaf9361..09bd20a631 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -1,31 +1,45 @@
diff --git a/app/src/main/res/menu/menu_single_fragment.xml b/app/src/main/res/menu/menu_single_fragment.xml
new file mode 100644
index 0000000000..0bc5ee19b8
--- /dev/null
+++ b/app/src/main/res/menu/menu_single_fragment.xml
@@ -0,0 +1,10 @@
+
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
deleted file mode 100644
index 5a74f20564..0000000000
--- a/app/src/main/res/values-v21/styles.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 8971062264..d36a1384a0 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -2,16 +2,12 @@
#ff00ff
#00ffff
-
-
#1e88e5
#1ea3e5
- #FB8C00
- #fb8c00
- #ff89ff
- #b601b6
-
+ #FFFB8C00
+ #FFFB8C00
+ #c9bd60
+ #00d2d2
#FFFFFF
#FFFFFF00
#FFFF00FF
@@ -37,9 +33,9 @@
#303F9F
- #3F51B5
- #303F9F
- #FF4081
+ #212121
+ #000000
+ #009688
#00695c
#121212
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 47c8224673..9b772f77bd 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -2,4 +2,5 @@
16dp
16dp
+ 30dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 087d917c46..5e2ab91291 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1089,4 +1089,7 @@
Request
Configure Insulin plugin
Exit
+ Open navigation
+ Close navigation
+ Plugin preferences
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 5519bcb151..202fc7d436 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,8 +1,12 @@
-
-
+
+