From 2ed968456a6abf5bbfa5f749efb2d6e3079ac061 Mon Sep 17 00:00:00 2001
From: Martijn Brekhof
Date: Thu, 5 Apr 2018 19:22:20 +0200
Subject: [PATCH] Upgraded butterknife to 8.8.1 (#524)
Refactored MusicListFragment and PVRListFragment to use AbstractTabsFragment
Fixed scrolling in a nested scroll view using espresso
Fixed issue with setting and checking Kodi major version
---
app/build.gradle | 3 +-
app/proguard-rules.pro | 4 +-
.../testhelpers/action/NestedScrollTo.java | 78 +++++++++++++++++++
.../kore/testhelpers/action/ViewActions.java | 14 ++++
.../xbmc/kore/tests/ui/AbstractTestClass.java | 15 +++-
.../RestoreSearchQueryViewPagerTest.java | 2 +
.../controlpad/eventserver/ButtonTests.java | 8 +-
.../eventserver/KodiPreV17Tests.java | 6 ++
.../remote/controlpad/http/ButtonTests.java | 6 ++
.../controlpad/http/KodiPreV17Tests.java | 6 ++
.../ui/tvshows/TVShowsActivityTests.java | 14 ++--
.../java/org/xbmc/kore/host/HostInfo.java | 4 +-
.../xbmc/kore/ui/AbstractInfoFragment.java | 58 ++++++++------
.../xbmc/kore/ui/AbstractListFragment.java | 18 +++--
.../xbmc/kore/ui/AbstractTabsFragment.java | 21 ++++-
.../org/xbmc/kore/ui/BaseMediaActivity.java | 6 +-
...olumeControllerDialogFragmentListener.java | 21 +++--
.../ui/sections/audio/MusicListFragment.java | 47 +++++------
.../ui/sections/file/FileListFragment.java | 37 ++-------
.../hosts/AddHostFragmentZeroconf.java | 24 ++++--
.../HostFragmentManualConfiguration.java | 36 +++++----
.../ui/sections/hosts/HostListFragment.java | 17 ++--
.../sections/remote/NowPlayingFragment.java | 57 ++++++++------
.../ui/sections/remote/PlaylistFragment.java | 21 +++--
.../ui/sections/remote/RemoteActivity.java | 14 ++--
.../ui/sections/remote/RemoteFragment.java | 66 +++++++++-------
.../ui/sections/video/AllCastActivity.java | 8 +-
.../video/PVRChannelEPGListFragment.java | 19 +++--
.../video/PVRChannelsListFragment.java | 19 +++--
.../ui/sections/video/PVRListFragment.java | 41 ++--------
.../video/PVRRecordingsListFragment.java | 19 +++--
.../org/xbmc/kore/ui/widgets/ControlPad.java | 35 +++++----
.../ui/widgets/MediaProgressIndicator.java | 27 +++++--
.../xbmc/kore/ui/widgets/NowPlayingPanel.java | 44 +++++++----
.../kore/ui/widgets/VolumeLevelIndicator.java | 18 ++++-
.../fabspeeddial/DialActionButton.java | 8 +-
.../ui/widgets/fabspeeddial/FABSpeedDial.java | 22 ++++--
.../main/res/layout/fragment_media_list.xml | 35 ---------
.../org/xbmc/kore/testutils/Database.java | 7 +-
39 files changed, 563 insertions(+), 342 deletions(-)
create mode 100644 app/src/androidTest/java/org/xbmc/kore/testhelpers/action/NestedScrollTo.java
delete mode 100644 app/src/main/res/layout/fragment_media_list.xml
diff --git a/app/build.gradle b/app/build.gradle
index ed97622f9..d512d7531 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -119,7 +119,8 @@ dependencies {
compile "com.android.support:design:${supportLibVersion}"
compile 'com.fasterxml.jackson.core:jackson-databind:2.5.2'
- compile 'com.jakewharton:butterknife:6.1.0'
+ compile 'com.jakewharton:butterknife:8.8.1'
+ annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
compile 'com.squareup.okhttp:okhttp:2.3.0'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'de.greenrobot:eventbus:2.4.0'
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 4b445ab83..5610fbb68 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -20,8 +20,8 @@
# Butterknife
-dontwarn butterknife.internal.**
--keep class **$$ViewInjector { *; }
--keepnames class * { @butterknife.InjectView *;}
+-keep class **$$ViewBinder { *; }
+-keepnames class * { @butterknife.BindView *;}
# Jackson
-dontskipnonpubliclibraryclassmembers
diff --git a/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/NestedScrollTo.java b/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/NestedScrollTo.java
new file mode 100644
index 000000000..53747abde
--- /dev/null
+++ b/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/NestedScrollTo.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018 Martijn Brekhof. 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.
+ */
+
+package org.xbmc.kore.testhelpers.action;
+
+import android.graphics.Rect;
+import android.support.test.espresso.PerformException;
+import android.support.test.espresso.UiController;
+import android.support.test.espresso.ViewAction;
+import android.support.test.espresso.matcher.ViewMatchers;
+import android.support.test.espresso.util.HumanReadables;
+import android.support.v4.widget.NestedScrollView;
+import android.view.View;
+
+import org.hamcrest.Matcher;
+import org.xbmc.kore.utils.LogUtils;
+
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast;
+import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
+import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
+import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.anyOf;
+
+/**
+ * Modified version of {@link android.support.test.espresso.action.ScrollToAction} to support
+ * NestedScrollView.
+ * TODO Check future versions of {@link android.support.test.espresso.action.ScrollToAction} to see if support for NestedScrollView has been added
+ */
+public class NestedScrollTo implements ViewAction {
+ private final static String TAG = LogUtils.makeLogTag(NestedScrollTo.class);
+
+ @Override
+ public Matcher getConstraints() {
+ return allOf(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE), isDescendantOfA(anyOf(
+ isAssignableFrom(NestedScrollView.class))));
+ }
+
+ @Override
+ public String getDescription() {
+ return "nested scroll to";
+ }
+
+ @Override
+ public void perform(UiController uiController, View view) {
+ if (isDisplayingAtLeast(90).matches(view)) {
+ LogUtils.LOGI(TAG, "View is already displayed. Returning.");
+ return;
+ }
+ Rect rect = new Rect();
+ view.getDrawingRect(rect);
+ if (!view.requestRectangleOnScreen(rect, true /* immediate */)) {
+ LogUtils.LOGW(TAG, "Scrolling to view was requested, but none of the parents scrolled.");
+ }
+ uiController.loopMainThreadUntilIdle();
+ if (!isDisplayingAtLeast(90).matches(view)) {
+ throw new PerformException.Builder()
+ .withActionDescription(this.getDescription())
+ .withViewDescription(HumanReadables.describe(view))
+ .withCause(new RuntimeException(
+ "Scrolling to view was attempted, but the view is not displayed"))
+ .build();
+ }
+ }
+}
diff --git a/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/ViewActions.java b/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/ViewActions.java
index 2eedad745..1bda9f9c9 100644
--- a/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/ViewActions.java
+++ b/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/ViewActions.java
@@ -22,6 +22,7 @@
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.action.MotionEvents;
import android.support.test.espresso.action.Press;
+import android.support.test.espresso.action.ScrollToAction;
import android.support.test.espresso.util.HumanReadables;
import android.support.test.espresso.util.TreeIterables;
import android.view.View;
@@ -50,6 +51,19 @@ public static ViewAction clearFocus() {
return actionWithAssertions(new ClearFocus());
}
+ /**
+ * Returns an action that scrolls to the view in a nested scroll view.
+ *
+ * View preconditions:
+ *
+ * - must be a descendant of NestedScrollView
+ *
- must have visibility set to View.VISIBLE
+ *
+ */
+ public static ViewAction nestedScrollTo() {
+ return actionWithAssertions(new NestedScrollTo());
+ }
+
public interface CheckStatus {
boolean check(View v);
}
diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/AbstractTestClass.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/AbstractTestClass.java
index 236f4259a..290dd27e5 100644
--- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/AbstractTestClass.java
+++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/AbstractTestClass.java
@@ -76,7 +76,7 @@ abstract public class AbstractTestClass {
private static PlayerHandler playerHandler;
private static ApplicationHandler applicationHandler;
private static InputHandler inputHandler;
-
+ private int kodiMajorVersion = HostInfo.DEFAULT_KODI_VERSION_MAJOR;
private HostInfo hostInfo;
@BeforeClass
@@ -120,7 +120,7 @@ public void setUp() throws Throwable {
hostInfo = Database.addHost(context, server.getHostName(),
HostConnection.PROTOCOL_TCP, HostInfo.DEFAULT_HTTP_PORT,
- server.getPort(), useEventServer);
+ server.getPort(), useEventServer, kodiMajorVersion);
//Allow each test to change the host info
configureHostInfo(hostInfo);
@@ -164,6 +164,17 @@ protected T getActivity() {
return null;
}
+ /**
+ * Use this to set the major version of Kodi.
+ *
+ * NOTE: be sure to call this before {@link #setUp()} is called to have the version correctly
+ * set in the database.
+ * @param kodiMajorVersion
+ */
+ protected void setKodiMajorVersion(int kodiMajorVersion) {
+ this.kodiMajorVersion = kodiMajorVersion;
+ }
+
public static PlayerHandler getPlayerHandler() {
return playerHandler;
}
diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/music/RestoreSearchQueryViewPagerTest.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/music/RestoreSearchQueryViewPagerTest.java
index 461b9e0da..f0273d92c 100644
--- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/music/RestoreSearchQueryViewPagerTest.java
+++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/music/RestoreSearchQueryViewPagerTest.java
@@ -18,6 +18,7 @@
import android.app.Activity;
import android.content.Context;
+import android.os.SystemClock;
import android.support.test.espresso.Espresso;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
@@ -180,6 +181,7 @@ public void searchSwitchTabRotateTest() {
clickAlbumsTab();
EspressoTestUtils.rotateDevice(activity);
EspressoTestUtils.clickMenuItem(activity, activity.getString(R.string.action_search), R.id.action_search);
+ Espresso.closeSoftKeyboard();
EspressoTestUtils.checkTextInSearchQuery("");
EspressoTestUtils.checkListMatchesSearchQuery("", ALBUM_COMPLETE_LIST_SIZE, R.id.list);
diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/ButtonTests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/ButtonTests.java
index 2b1813a85..981f1b33f 100644
--- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/ButtonTests.java
+++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/ButtonTests.java
@@ -64,7 +64,7 @@ protected void setSharedPreferences(Context context) {
@Override
protected void configureHostInfo(HostInfo hostInfo) {
- hostInfo.setKodiVersionMajor(17);
+
}
@BeforeClass
@@ -74,6 +74,12 @@ public static void setupEventServer() throws Throwable {
mockEventServer.start();
}
+ @Override
+ public void setUp() throws Throwable {
+ setKodiMajorVersion(HostInfo.KODI_V17_KRYPTON);
+ super.setUp();
+ }
+
@After
public void resetState() {
mockEventServer.reset();
diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/KodiPreV17Tests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/KodiPreV17Tests.java
index 33e2d7b26..1a34663dc 100644
--- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/KodiPreV17Tests.java
+++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/KodiPreV17Tests.java
@@ -69,6 +69,12 @@ public static void setupEventServer() throws Throwable {
mockEventServer.start();
}
+ @Override
+ public void setUp() throws Throwable {
+ setKodiMajorVersion(HostInfo.KODI_V16_JARVIS);
+ super.setUp();
+ }
+
@After
public void resetState() {
mockEventServer.reset();
diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/ButtonTests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/ButtonTests.java
index b7d0e6b69..da343d4de 100644
--- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/ButtonTests.java
+++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/ButtonTests.java
@@ -55,6 +55,12 @@ protected void configureHostInfo(HostInfo hostInfo) {
hostInfo.setKodiVersionMajor(17);
}
+ @Override
+ public void setUp() throws Throwable {
+ setKodiMajorVersion(HostInfo.KODI_V17_KRYPTON);
+ super.setUp();
+ }
+
@Test
public void leftControlPadButtonTest() throws InterruptedException {
onView(withId(R.id.left)).perform(click());
diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/KodiPreV17Tests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/KodiPreV17Tests.java
index 4c000326d..47a3ab6e7 100644
--- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/KodiPreV17Tests.java
+++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/KodiPreV17Tests.java
@@ -53,6 +53,12 @@ protected void configureHostInfo(HostInfo hostInfo) {
hostInfo.setKodiVersionMajor(16);
}
+ @Override
+ public void setUp() throws Throwable {
+ setKodiMajorVersion(HostInfo.KODI_V16_JARVIS);
+ super.setUp();
+ }
+
@Test
public void infoControlPadButtonLongClickTest() throws InterruptedException {
onView(withId(R.id.info)).perform(longClick());
diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/tvshows/TVShowsActivityTests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/tvshows/TVShowsActivityTests.java
index 312eda121..6bd19840b 100644
--- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/tvshows/TVShowsActivityTests.java
+++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/tvshows/TVShowsActivityTests.java
@@ -28,13 +28,13 @@
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.action.ViewActions.scrollTo;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withParent;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.instanceOf;
+import static org.xbmc.kore.testhelpers.action.ViewActions.nestedScrollTo;
public class TVShowsActivityTests extends BaseMediaActivityTests {
@@ -79,7 +79,7 @@ public void setActionBarTitle() {
@Test
public void setActionBarTitleOnNextEpisode() {
EspressoTestUtils.clickAdapterViewItem(1, R.id.list);
- onView( withId(R.id.next_episode_list)).perform( scrollTo(), click());
+ onView( withId(R.id.next_episode_list)).perform( nestedScrollTo(), click());
onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.default_toolbar))))
.check(matches(withText("3")));
@@ -96,7 +96,7 @@ public void setActionBarTitleOnNextEpisode() {
@Test
public void setActionBarTitleOnSeasonList() {
EspressoTestUtils.clickAdapterViewItem(0, R.id.list);
- onView( withId(R.id.seasons_list)).perform( scrollTo(), click());
+ onView( withId(R.id.seasons_list)).perform( nestedScrollTo(), click());
onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.default_toolbar))))
.check(matches(withText("Season 01")));
@@ -114,7 +114,7 @@ public void setActionBarTitleOnSeasonList() {
@Test
public void setActionBarTitleOnSeasonListEpisode() {
EspressoTestUtils.clickAdapterViewItem(0, R.id.list);
- onView( withId(R.id.seasons_list)).perform( scrollTo(), click());
+ onView( withId(R.id.seasons_list)).perform( nestedScrollTo(), click());
EspressoTestUtils.selectListItemAndCheckActionbarTitle(0, R.id.list, "11.22.63");
}
@@ -145,7 +145,7 @@ public void restoreActionBarTitleOnConfigurationStateChanged() {
@Test
public void restoreActionBarTitleSeasonListOnConfigurationStateChanged() {
EspressoTestUtils.clickAdapterViewItem(0, R.id.list);
- onView( withId(R.id.seasons_list)).perform( scrollTo(), click());
+ onView( withId(R.id.seasons_list)).perform( nestedScrollTo(), click());
EspressoTestUtils.rotateDevice(mActivityRule.getActivity());
onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.default_toolbar))))
@@ -165,7 +165,7 @@ public void restoreActionBarTitleSeasonListOnConfigurationStateChanged() {
@Test
public void restoreActionBarTitleSeasonListEpisodeOnConfigurationStateChanged() {
EspressoTestUtils.clickAdapterViewItem(0, R.id.list);
- onView( withId(R.id.seasons_list)).perform( scrollTo(), click());
+ onView( withId(R.id.seasons_list)).perform( nestedScrollTo(), click());
EspressoTestUtils.selectListItemRotateDeviceAndCheckActionbarTitle(0, R.id.list,
"11.22.63",
mActivityRule.getActivity());
@@ -183,7 +183,7 @@ public void restoreActionBarTitleSeasonListEpisodeOnConfigurationStateChanged()
@Test
public void restoreActionBarTitleNextEpisodeOnConfigurationStateChanged() {
EspressoTestUtils.clickAdapterViewItem(1, R.id.list);
- onView( withId(R.id.next_episode_list)).perform( scrollTo() );
+ onView( withId(R.id.next_episode_list)).perform( nestedScrollTo() );
onView( withText("You'll See the Sparkle")).perform( click() );
EspressoTestUtils.rotateDevice(mActivityRule.getActivity());
diff --git a/app/src/main/java/org/xbmc/kore/host/HostInfo.java b/app/src/main/java/org/xbmc/kore/host/HostInfo.java
index 1e6026cb9..bf58d18ac 100644
--- a/app/src/main/java/org/xbmc/kore/host/HostInfo.java
+++ b/app/src/main/java/org/xbmc/kore/host/HostInfo.java
@@ -300,11 +300,11 @@ public void setKodiVersionTag(String kodiVersionTag) {
}
public boolean isGothamOrLater() {
- return kodiVersionMajor > KODI_V13_GOTHAM;
+ return kodiVersionMajor >= KODI_V13_GOTHAM;
}
public boolean isKryptonOrLater() {
- return kodiVersionMajor > KODI_V17_KRYPTON;
+ return kodiVersionMajor >= KODI_V17_KRYPTON;
}
/**
diff --git a/app/src/main/java/org/xbmc/kore/ui/AbstractInfoFragment.java b/app/src/main/java/org/xbmc/kore/ui/AbstractInfoFragment.java
index 9318185c4..1a2685405 100644
--- a/app/src/main/java/org/xbmc/kore/ui/AbstractInfoFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/AbstractInfoFragment.java
@@ -70,7 +70,8 @@
import at.blogc.android.views.ExpandableTextView;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
import static android.view.View.GONE;
@@ -83,29 +84,29 @@ abstract public class AbstractInfoFragment extends AbstractFragment
private static final String BUNDLE_KEY_APIMETHOD_PENDING = "pending_apimethod";
// Detail views
- @InjectView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
- @InjectView(R.id.media_panel) NestedScrollView panelScrollView;
- @InjectView(R.id.art) ImageView artImageView;
- @InjectView(R.id.poster) ImageView posterImageView;
- @InjectView(R.id.media_title) TextView titleTextView;
- @InjectView(R.id.media_undertitle) TextView underTitleTextView;
- @InjectView(R.id.rating_container) LinearLayout ratingContainer;
- @InjectView(R.id.rating) TextView ratingTextView;
- @InjectView(R.id.rating_votes) TextView ratingVotesTextView;
- @InjectView(R.id.max_rating) TextView maxRatingTextView;
- @InjectView(R.id.media_details_right) TextView detailsRightTextView;
- @InjectView(R.id.media_details) LinearLayout mediaDetailsContainer;
- @InjectView(R.id.media_action_download) ImageButton downloadButton;
- @InjectView(R.id.media_action_pin_unpin) ImageButton pinUnpinButton;
- @InjectView(R.id.media_action_add_to_playlist) ImageButton addToPlaylistButton;
- @InjectView(R.id.media_action_seen) ImageButton seenButton;
- @InjectView(R.id.media_action_go_to_imdb) ImageButton imdbButton;
- @InjectView(R.id.media_actions_bar) LinearLayout mediaActionsBar;
- @InjectView(R.id.media_description) ExpandableTextView descriptionExpandableTextView;
- @InjectView(R.id.media_description_container) LinearLayout descriptionContainer;
- @InjectView(R.id.show_all) ImageView expansionImage;
- @InjectView(R.id.fab) FABSpeedDial fabButton;
- @InjectView(R.id.exit_transition_view) View exitTransitionView;
+ @BindView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
+ @BindView(R.id.media_panel) NestedScrollView panelScrollView;
+ @BindView(R.id.art) ImageView artImageView;
+ @BindView(R.id.poster) ImageView posterImageView;
+ @BindView(R.id.media_title) TextView titleTextView;
+ @BindView(R.id.media_undertitle) TextView underTitleTextView;
+ @BindView(R.id.rating_container) LinearLayout ratingContainer;
+ @BindView(R.id.rating) TextView ratingTextView;
+ @BindView(R.id.rating_votes) TextView ratingVotesTextView;
+ @BindView(R.id.max_rating) TextView maxRatingTextView;
+ @BindView(R.id.media_details_right) TextView detailsRightTextView;
+ @BindView(R.id.media_details) LinearLayout mediaDetailsContainer;
+ @BindView(R.id.media_action_download) ImageButton downloadButton;
+ @BindView(R.id.media_action_pin_unpin) ImageButton pinUnpinButton;
+ @BindView(R.id.media_action_add_to_playlist) ImageButton addToPlaylistButton;
+ @BindView(R.id.media_action_seen) ImageButton seenButton;
+ @BindView(R.id.media_action_go_to_imdb) ImageButton imdbButton;
+ @BindView(R.id.media_actions_bar) LinearLayout mediaActionsBar;
+ @BindView(R.id.media_description) ExpandableTextView descriptionExpandableTextView;
+ @BindView(R.id.media_description_container) LinearLayout descriptionContainer;
+ @BindView(R.id.show_all) ImageView expansionImage;
+ @BindView(R.id.fab) FABSpeedDial fabButton;
+ @BindView(R.id.exit_transition_view) View exitTransitionView;
private HostManager hostManager;
private HostInfo hostInfo;
@@ -113,6 +114,7 @@ abstract public class AbstractInfoFragment extends AbstractFragment
private RefreshItem refreshItem;
private boolean expandDescription;
private int methodId;
+ private Unbinder unbinder;
/**
* Handler on which to post RPC callbacks
@@ -146,7 +148,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
}
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_info, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
Resources resources = getActivity().getResources();
@@ -244,6 +246,12 @@ public void onStop() {
SyncUtils.disconnectFromLibrarySyncService(getActivity(), serviceConnection);
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
diff --git a/app/src/main/java/org/xbmc/kore/ui/AbstractListFragment.java b/app/src/main/java/org/xbmc/kore/ui/AbstractListFragment.java
index 7af19c951..72f2e2bb6 100644
--- a/app/src/main/java/org/xbmc/kore/ui/AbstractListFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/AbstractListFragment.java
@@ -41,7 +41,8 @@
import org.xbmc.kore.utils.Utils;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
public abstract class AbstractListFragment extends Fragment implements
SwipeRefreshLayout.OnRefreshListener {
@@ -51,10 +52,11 @@ public abstract class AbstractListFragment extends Fragment implements
private final String BUNDLE_SAVEDINSTANCE_LISTPOSITION = "lposition";
private boolean gridViewUsesMultipleColumns;
+ private Unbinder unbinder;
- protected @InjectView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
- @InjectView(R.id.list) GridView gridView;
- @InjectView(android.R.id.empty) TextView emptyView;
+ protected @BindView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
+ @BindView(R.id.list) GridView gridView;
+ @BindView(android.R.id.empty) TextView emptyView;
abstract protected AdapterView.OnItemClickListener createOnItemClickListener();
abstract protected BaseAdapter createAdapter();
@@ -70,7 +72,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_generic_media_list, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
swipeRefreshLayout.setOnRefreshListener(this);
@@ -113,6 +115,12 @@ public void onGlobalLayout() {
return root;
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
diff --git a/app/src/main/java/org/xbmc/kore/ui/AbstractTabsFragment.java b/app/src/main/java/org/xbmc/kore/ui/AbstractTabsFragment.java
index 2adfbc38d..acc1f5f62 100644
--- a/app/src/main/java/org/xbmc/kore/ui/AbstractTabsFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/AbstractTabsFragment.java
@@ -31,15 +31,18 @@
import org.xbmc.kore.utils.TabsAdapter;
import org.xbmc.kore.utils.UIUtils;
+import butterknife.BindView;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.Unbinder;
abstract public class AbstractTabsFragment extends AbstractFragment
implements SharedElementTransition.SharedElement {
private static final String TAG = LogUtils.makeLogTag(AbstractTabsFragment.class);
- @InjectView(R.id.pager_tab_strip) PagerSlidingTabStrip pagerTabStrip;
- @InjectView(R.id.pager) ViewPager viewPager;
+ @BindView(R.id.pager_tab_strip) PagerSlidingTabStrip pagerTabStrip;
+ @BindView(R.id.pager) ViewPager viewPager;
+
+ private Unbinder unbinder;
/**
* Use {@link #setDataHolder(AbstractInfoFragment.DataHolder)} to provide the required info
@@ -58,7 +61,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
}
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_default_view_pager, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
viewPager.setAdapter(createTabsAdapter(getDataHolder()));
pagerTabStrip.setViewPager(viewPager);
@@ -72,6 +75,12 @@ public void onActivityCreated (Bundle savedInstanceState) {
setHasOptionsMenu(false);
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
@Override
public boolean isSharedElementVisible() {
View view = getView();
@@ -92,6 +101,10 @@ public boolean isSharedElementVisible() {
return false;
}
+ protected ViewPager getViewPager() {
+ return viewPager;
+ }
+
/**
* Called to get the TabsAdapter that should be connected to the ViewPager
* @param dataHolder the data passed to the *DetailsFragment
diff --git a/app/src/main/java/org/xbmc/kore/ui/BaseMediaActivity.java b/app/src/main/java/org/xbmc/kore/ui/BaseMediaActivity.java
index 596f29c6f..88f97fec2 100644
--- a/app/src/main/java/org/xbmc/kore/ui/BaseMediaActivity.java
+++ b/app/src/main/java/org/xbmc/kore/ui/BaseMediaActivity.java
@@ -59,7 +59,7 @@
import org.xbmc.kore.utils.Utils;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
public abstract class BaseMediaActivity extends BaseActivity
implements HostConnectionObserver.ApplicationEventsObserver,
@@ -71,7 +71,7 @@ public abstract class BaseMediaActivity extends BaseActivity
private static final String NAVICON_ISARROW = "navstate";
private static final String ACTIONBAR_TITLE = "actionbartitle";
- @InjectView(R.id.now_playing_panel) NowPlayingPanel nowPlayingPanel;
+ @BindView(R.id.now_playing_panel) NowPlayingPanel nowPlayingPanel;
private NavigationDrawerFragment navigationDrawerFragment;
private SharedElementTransition sharedElementTransition = new SharedElementTransition();
@@ -111,7 +111,7 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_generic_media);
- ButterKnife.inject(this);
+ ButterKnife.bind(this);
// Set up the drawer.
navigationDrawerFragment = (NavigationDrawerFragment)getSupportFragmentManager()
diff --git a/app/src/main/java/org/xbmc/kore/ui/generic/VolumeControllerDialogFragmentListener.java b/app/src/main/java/org/xbmc/kore/ui/generic/VolumeControllerDialogFragmentListener.java
index c6b2fb046..825c71a5f 100644
--- a/app/src/main/java/org/xbmc/kore/ui/generic/VolumeControllerDialogFragmentListener.java
+++ b/app/src/main/java/org/xbmc/kore/ui/generic/VolumeControllerDialogFragmentListener.java
@@ -26,7 +26,8 @@
import org.xbmc.kore.utils.LogUtils;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
public class VolumeControllerDialogFragmentListener extends AppCompatDialogFragment
implements HostConnectionObserver.ApplicationEventsObserver,
@@ -35,13 +36,11 @@ public class VolumeControllerDialogFragmentListener extends AppCompatDialogFragm
private static final String TAG = LogUtils.makeLogTag(VolumeControllerDialogFragmentListener.class);
private static final int AUTO_DISMISS_DELAY = 2000;
- @InjectView(R.id.npp_volume_mute)
- HighlightButton volumeMuteButton;
- @InjectView(R.id.npp_volume_muted_indicator)
- HighlightButton volumeMutedIndicatorButton;
- @InjectView(R.id.npp_volume_level_indicator)
- VolumeLevelIndicator volumeLevelIndicator;
+ @BindView(R.id.npp_volume_mute) HighlightButton volumeMuteButton;
+ @BindView(R.id.npp_volume_muted_indicator) HighlightButton volumeMutedIndicatorButton;
+ @BindView(R.id.npp_volume_level_indicator) VolumeLevelIndicator volumeLevelIndicator;
+ private Unbinder unbinder;
private Handler callbackHandler = new Handler();
private HostManager hostManager = null;
private ApiCallback defaultIntActionCallback = ApiMethod.getDefaultActionCallback();
@@ -100,7 +99,7 @@ public boolean onKey(android.content.DialogInterface dialog, int keyCode,
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.volume_controller_dialog, container, false);
- ButterKnife.inject(this, rootView);
+ unbinder = ButterKnife.bind(this, rootView);
return rootView;
}
@@ -123,6 +122,12 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
delayedDismissDialog();
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
private void registerObserver() {
HostConnectionObserver hostConnectionObserver = hostManager.getHostConnectionObserver();
if (hostConnectionObserver == null) {
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/audio/MusicListFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/audio/MusicListFragment.java
index 2f8e095f3..ce45ccf31 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/audio/MusicListFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/audio/MusicListFragment.java
@@ -26,43 +26,32 @@
import org.xbmc.kore.R;
import org.xbmc.kore.ui.AbstractCursorListFragment;
+import org.xbmc.kore.ui.AbstractFragment;
+import org.xbmc.kore.ui.AbstractTabsFragment;
import org.xbmc.kore.utils.LogUtils;
import org.xbmc.kore.utils.TabsAdapter;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
/**
* Container for the various music lists
*/
-public class MusicListFragment extends Fragment {
+public class MusicListFragment extends AbstractTabsFragment {
private static final String TAG = LogUtils.makeLogTag(MusicListFragment.class);
- private TabsAdapter tabsAdapter;
-
private int currentItem;
-
- @InjectView(R.id.pager_tab_strip) PagerSlidingTabStrip pagerTabStrip;
- @InjectView(R.id.pager) ViewPager viewPager;
+ private TabsAdapter tabsAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_default_view_pager, container, false);
- ButterKnife.inject(this, root);
-
- tabsAdapter = new TabsAdapter(getActivity(), getChildFragmentManager())
- .addTab(ArtistListFragment.class, getArguments(), R.string.artists, 1)
- .addTab(AlbumListFragment.class, getArguments(), R.string.albums, 2)
- .addTab(AudioGenresListFragment.class, getArguments(), R.string.genres, 3)
- .addTab(SongsListFragment.class, getArguments(), R.string.songs, 4)
- .addTab(MusicVideoListFragment.class, getArguments(), R.string.music_videos, 5);
+ View view = super.onCreateView(inflater, container, savedInstanceState);
+ if (view == null)
+ return view;
- viewPager.setAdapter(tabsAdapter);
- pagerTabStrip.setViewPager(viewPager);
+ currentItem = getViewPager().getCurrentItem();
- currentItem = viewPager.getCurrentItem();
-
- viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ getViewPager().addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
@@ -75,14 +64,15 @@ public void onPageSelected(int position) {
if (f != null) {
f.saveSearchState();
}
- currentItem = viewPager.getCurrentItem();
+ currentItem = getViewPager().getCurrentItem();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
- return root;
+
+ return view;
}
@Override
@@ -90,4 +80,15 @@ public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(false);
}
+
+ @Override
+ protected TabsAdapter createTabsAdapter(DataHolder dataHolder) {
+ tabsAdapter = new TabsAdapter(getActivity(), getChildFragmentManager())
+ .addTab(ArtistListFragment.class, getArguments(), R.string.artists, 1)
+ .addTab(AlbumListFragment.class, getArguments(), R.string.albums, 2)
+ .addTab(AudioGenresListFragment.class, getArguments(), R.string.genres, 3)
+ .addTab(SongsListFragment.class, getArguments(), R.string.songs, 4)
+ .addTab(MusicVideoListFragment.class, getArguments(), R.string.music_videos, 5);
+ return tabsAdapter;
+ }
}
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/file/FileListFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/file/FileListFragment.java
index af6a70ba1..1e5316355 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/file/FileListFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/file/FileListFragment.java
@@ -17,54 +17,31 @@
import android.app.Activity;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.view.ViewPager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import com.astuetz.PagerSlidingTabStrip;
+
import org.xbmc.kore.R;
import org.xbmc.kore.jsonrpc.method.Files;
+import org.xbmc.kore.ui.AbstractTabsFragment;
import org.xbmc.kore.ui.OnBackPressedListener;
import org.xbmc.kore.utils.TabsAdapter;
-import butterknife.ButterKnife;
-import butterknife.InjectView;
-
/**
* Manages the viewpager of files
*/
-public class FileListFragment extends Fragment
+public class FileListFragment extends AbstractTabsFragment
implements OnBackPressedListener {
- @InjectView(R.id.pager_tab_strip) PagerSlidingTabStrip pagerTabStrip;
- @InjectView(R.id.pager) ViewPager viewPager;
-
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_media_list, container, false);
- ButterKnife.inject(this, root);
-
+ protected TabsAdapter createTabsAdapter(DataHolder dataHolder) {
Bundle videoFileListArgs = new Bundle();
videoFileListArgs.putString(MediaFileListFragment.MEDIA_TYPE, Files.Media.VIDEO);
Bundle musicFileListArgs = new Bundle();
musicFileListArgs.putString(MediaFileListFragment.MEDIA_TYPE, Files.Media.MUSIC);
Bundle pictureFileListArgs = new Bundle();
pictureFileListArgs.putString(MediaFileListFragment.MEDIA_TYPE, Files.Media.PICTURES);
- TabsAdapter tabsAdapter = new TabsAdapter(getActivity(), getChildFragmentManager())
+ return new TabsAdapter(getActivity(), getChildFragmentManager())
.addTab(MediaFileListFragment.class, videoFileListArgs, R.string.video, 1)
.addTab(MediaFileListFragment.class, musicFileListArgs, R.string.music, 2)
.addTab(MediaFileListFragment.class, pictureFileListArgs, R.string.pictures, 3);
- viewPager.setAdapter(tabsAdapter);
- pagerTabStrip.setViewPager(viewPager);
- return root;
- }
-
- @Override
- public void onActivityCreated (Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- setHasOptionsMenu(false);
}
@Override
@@ -81,8 +58,8 @@ public void onAttach(Activity activity) {
@Override
public boolean onBackPressed() {
// Tell current fragment to move up one directory, if possible
- MediaFileListFragment curPage = (MediaFileListFragment)((TabsAdapter)viewPager.getAdapter())
- .getStoredFragment(viewPager.getCurrentItem());
+ MediaFileListFragment curPage = (MediaFileListFragment)((TabsAdapter)getViewPager().getAdapter())
+ .getStoredFragment(getViewPager().getCurrentItem());
if ((curPage != null) && !curPage.atRootDirectory()) {
curPage.onBackPressed();
return true;
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/hosts/AddHostFragmentZeroconf.java b/app/src/main/java/org/xbmc/kore/ui/sections/hosts/AddHostFragmentZeroconf.java
index 6c140802c..2de07cc82 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/hosts/AddHostFragmentZeroconf.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/hosts/AddHostFragmentZeroconf.java
@@ -50,7 +50,8 @@
import javax.jmdns.ServiceInfo;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
/**
* Fragment that searchs foor XBMCs using Zeroconf
@@ -75,19 +76,20 @@ public interface AddHostZeroconfListener {
}
private AddHostZeroconfListener listener;
+ private Unbinder unbinder;
- @InjectView(R.id.search_host_title) TextView titleTextView;
- @InjectView(R.id.search_host_message) TextView messageTextView;
- @InjectView(R.id.next) Button nextButton;
- @InjectView(R.id.previous) Button previousButton;
+ @BindView(R.id.search_host_title) TextView titleTextView;
+ @BindView(R.id.search_host_message) TextView messageTextView;
+ @BindView(R.id.next) Button nextButton;
+ @BindView(R.id.previous) Button previousButton;
- @InjectView(R.id.progress_bar) ProgressBar progressBar;
- @InjectView(R.id.list) GridView hostListGridView;
+ @BindView(R.id.progress_bar) ProgressBar progressBar;
+ @BindView(R.id.list) GridView hostListGridView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_add_host_zeroconf, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
return root;
}
@@ -112,6 +114,12 @@ public void onAttach(Activity activity) {
}
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
// Whether the user cancelled the search
private boolean searchCancelled = false;
private final Object lock = new Object();
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/hosts/HostFragmentManualConfiguration.java b/app/src/main/java/org/xbmc/kore/ui/sections/hosts/HostFragmentManualConfiguration.java
index acde208f4..c06814b59 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/hosts/HostFragmentManualConfiguration.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/hosts/HostFragmentManualConfiguration.java
@@ -47,7 +47,8 @@
import java.util.regex.Pattern;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
/**
* Fragment that presents the welcome message
@@ -84,18 +85,19 @@ public interface HostManualConfigurationListener {
public static String CANCEL_BUTTON_LABEL_ARG = PREFIX + ".cancel_button_label";
private HostManualConfigurationListener listener;
private ProgressDialog progressDialog;
-
- @InjectView(R.id.xbmc_name) EditText xbmcNameEditText;
- @InjectView(R.id.xbmc_ip_address) EditText xbmcIpAddressEditText;
- @InjectView(R.id.xbmc_http_port) EditText xbmcHttpPortEditText;
- @InjectView(R.id.xbmc_tcp_port) EditText xbmcTcpPortEditText;
- @InjectView(R.id.xbmc_username) EditText xbmcUsernameEditText;
- @InjectView(R.id.xbmc_password) EditText xbmcPasswordEditText;
- @InjectView(R.id.xbmc_mac_address) EditText xbmcMacAddressEditText;
- @InjectView(R.id.xbmc_wol_port) EditText xbmcWolPortEditText;
- @InjectView(R.id.xbmc_use_tcp) CheckBox xbmcUseTcpCheckbox;
- @InjectView(R.id.xbmc_use_event_server) CheckBox xbmcUseEventServerCheckbox;
- @InjectView(R.id.xbmc_event_server_port) EditText xbmcEventServerPortEditText;
+ private Unbinder unbinder;
+
+ @BindView(R.id.xbmc_name) EditText xbmcNameEditText;
+ @BindView(R.id.xbmc_ip_address) EditText xbmcIpAddressEditText;
+ @BindView(R.id.xbmc_http_port) EditText xbmcHttpPortEditText;
+ @BindView(R.id.xbmc_tcp_port) EditText xbmcTcpPortEditText;
+ @BindView(R.id.xbmc_username) EditText xbmcUsernameEditText;
+ @BindView(R.id.xbmc_password) EditText xbmcPasswordEditText;
+ @BindView(R.id.xbmc_mac_address) EditText xbmcMacAddressEditText;
+ @BindView(R.id.xbmc_wol_port) EditText xbmcWolPortEditText;
+ @BindView(R.id.xbmc_use_tcp) CheckBox xbmcUseTcpCheckbox;
+ @BindView(R.id.xbmc_use_event_server) CheckBox xbmcUseEventServerCheckbox;
+ @BindView(R.id.xbmc_event_server_port) EditText xbmcEventServerPortEditText;
// Handler for callbacks
final Handler handler = new Handler();
@@ -103,7 +105,7 @@ public interface HostManualConfigurationListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_add_host_manual_configuration, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
// By default, use TCP
xbmcUseTcpCheckbox.setChecked(true);
@@ -215,6 +217,12 @@ public void onAttach(Activity activity) {
}
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
private static boolean isValidPort(int port) {
return port > 0 && port <= 65535;
}
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/hosts/HostListFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/hosts/HostListFragment.java
index 16db83d56..95dc675ff 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/hosts/HostListFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/hosts/HostListFragment.java
@@ -53,8 +53,9 @@
import java.util.List;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
import butterknife.OnClick;
+import butterknife.Unbinder;
/**
* Fragment to manage the list oof registered hosts.
@@ -65,11 +66,11 @@ public class HostListFragment extends Fragment {
private ArrayList hostInfoRows = new ArrayList();
private HostListAdapter adapter = null;
private Context context;
-
+ private Unbinder unbinder;
private Handler callbackHandler = new Handler();
- @InjectView(R.id.list) GridView hostGridView;
- @InjectView(R.id.action_add_host) Button addHostButton;
+ @BindView(R.id.list) GridView hostGridView;
+ @BindView(R.id.action_add_host) Button addHostButton;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -81,7 +82,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
context = inflater.getContext();
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_host_list, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
// Get the host list
// TODO: This is being done synchronously !!!
@@ -160,6 +161,12 @@ public void onPause() {
super.onPause();
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
/**
* Pings the host to checks it status.
*
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/remote/NowPlayingFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/remote/NowPlayingFragment.java
index 53d20de83..3e2015c89 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/remote/NowPlayingFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/remote/NowPlayingFragment.java
@@ -66,8 +66,9 @@
import java.util.List;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
import butterknife.OnClick;
+import butterknife.Unbinder;
/**
* Now playing view
@@ -128,39 +129,41 @@ public interface NowPlayingListener {
private ApiCallback defaultIntActionCallback = ApiMethod.getDefaultActionCallback();
private ApiCallback defaultBooleanActionCallback = ApiMethod.getDefaultActionCallback();
+ private Unbinder unbinder;
+
/**
* Injectable views
*/
- @InjectView(R.id.play) ImageButton playButton;
+ @BindView(R.id.play) ImageButton playButton;
- @InjectView(R.id.volume_mute) HighlightButton volumeMuteButton;
- @InjectView(R.id.shuffle) HighlightButton shuffleButton;
- @InjectView(R.id.repeat) RepeatModeButton repeatButton;
- @InjectView(R.id.overflow) ImageButton overflowButton;
+ @BindView(R.id.volume_mute) HighlightButton volumeMuteButton;
+ @BindView(R.id.shuffle) HighlightButton shuffleButton;
+ @BindView(R.id.repeat) RepeatModeButton repeatButton;
+ @BindView(R.id.overflow) ImageButton overflowButton;
- @InjectView(R.id.info_panel) RelativeLayout infoPanel;
- @InjectView(R.id.media_panel) ScrollView mediaPanel;
+ @BindView(R.id.info_panel) RelativeLayout infoPanel;
+ @BindView(R.id.media_panel) ScrollView mediaPanel;
- @InjectView(R.id.info_title) TextView infoTitle;
- @InjectView(R.id.info_message) TextView infoMessage;
+ @BindView(R.id.info_title) TextView infoTitle;
+ @BindView(R.id.info_message) TextView infoMessage;
- @InjectView(R.id.art) ImageView mediaArt;
- @InjectView(R.id.poster) ImageView mediaPoster;
+ @BindView(R.id.art) ImageView mediaArt;
+ @BindView(R.id.poster) ImageView mediaPoster;
- @InjectView(R.id.media_title) TextView mediaTitle;
- @InjectView(R.id.media_undertitle) TextView mediaUndertitle;
- @InjectView(R.id.progress_info) MediaProgressIndicator mediaProgressIndicator;
+ @BindView(R.id.media_title) TextView mediaTitle;
+ @BindView(R.id.media_undertitle) TextView mediaUndertitle;
+ @BindView(R.id.progress_info) MediaProgressIndicator mediaProgressIndicator;
- @InjectView(R.id.volume_level_indicator) VolumeLevelIndicator volumeLevelIndicator;
+ @BindView(R.id.volume_level_indicator) VolumeLevelIndicator volumeLevelIndicator;
- @InjectView(R.id.rating) TextView mediaRating;
- @InjectView(R.id.max_rating) TextView mediaMaxRating;
- @InjectView(R.id.year) TextView mediaYear;
- @InjectView(R.id.genres) TextView mediaGenreSeason;
- @InjectView(R.id.rating_votes) TextView mediaRatingVotes;
+ @BindView(R.id.rating) TextView mediaRating;
+ @BindView(R.id.max_rating) TextView mediaMaxRating;
+ @BindView(R.id.year) TextView mediaYear;
+ @BindView(R.id.genres) TextView mediaGenreSeason;
+ @BindView(R.id.rating_votes) TextView mediaRatingVotes;
- @InjectView(R.id.media_description) TextView mediaDescription;
- @InjectView(R.id.cast_list) GridLayout videoCastList;
+ @BindView(R.id.media_description) TextView mediaDescription;
+ @BindView(R.id.cast_list) GridLayout videoCastList;
@Override
public void onAttach(Activity activity) {
@@ -183,7 +186,7 @@ public void onCreate(Bundle savedInstanceState) {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_now_playing, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
volumeLevelIndicator.setOnVolumeChangeListener(new VolumeLevelIndicator.OnVolumeChangeListener() {
@Override
@@ -244,6 +247,12 @@ public void onPause() {
hostConnectionObserver.unregisterApplicationObserver(this);
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
/**
* Default callback for methods that don't return anything
*/
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/remote/PlaylistFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/remote/PlaylistFragment.java
index bc10ec21c..68a9db8d3 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/remote/PlaylistFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/remote/PlaylistFragment.java
@@ -57,7 +57,8 @@
import java.util.List;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
/**
* Playlist view
@@ -96,14 +97,16 @@ public class PlaylistFragment extends Fragment
*/
private PlayListAdapter playListAdapter;
+ private Unbinder unbinder;
+
/**
* Injectable views
*/
- @InjectView(R.id.info_panel) RelativeLayout infoPanel;
- @InjectView(R.id.playlist) DynamicListView playlistListView;
+ @BindView(R.id.info_panel) RelativeLayout infoPanel;
+ @BindView(R.id.playlist) DynamicListView playlistListView;
- @InjectView(R.id.info_title) TextView infoTitle;
- @InjectView(R.id.info_message) TextView infoMessage;
+ @BindView(R.id.info_title) TextView infoTitle;
+ @BindView(R.id.info_message) TextView infoMessage;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -115,7 +118,7 @@ public void onCreate(Bundle savedInstanceState) {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_playlist, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
playListAdapter = new PlayListAdapter();
playlistListView.setAdapter(playListAdapter);
@@ -157,6 +160,12 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteActivity.java b/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteActivity.java
index fcdbdc672..3e7573619 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteActivity.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteActivity.java
@@ -53,9 +53,9 @@
import org.xbmc.kore.ui.BaseActivity;
import org.xbmc.kore.ui.generic.NavigationDrawerFragment;
import org.xbmc.kore.ui.generic.SendTextDialogFragment;
+import org.xbmc.kore.ui.generic.VolumeControllerDialogFragmentListener;
import org.xbmc.kore.ui.sections.hosts.AddHostActivity;
import org.xbmc.kore.ui.views.CirclePageIndicator;
-import org.xbmc.kore.ui.generic.VolumeControllerDialogFragmentListener;
import org.xbmc.kore.utils.LogUtils;
import org.xbmc.kore.utils.TabsAdapter;
import org.xbmc.kore.utils.UIUtils;
@@ -69,8 +69,8 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import butterknife.BindView;
import butterknife.ButterKnife;
-import butterknife.InjectView;
public class RemoteActivity extends BaseActivity
@@ -100,10 +100,10 @@ public class RemoteActivity extends BaseActivity
private Future awaitingShare;
- @InjectView(R.id.background_image) ImageView backgroundImage;
- @InjectView(R.id.pager_indicator) CirclePageIndicator pageIndicator;
- @InjectView(R.id.pager) ViewPager viewPager;
- @InjectView(R.id.default_toolbar) Toolbar toolbar;
+ @BindView(R.id.background_image) ImageView backgroundImage;
+ @BindView(R.id.pager_indicator) CirclePageIndicator pageIndicator;
+ @BindView(R.id.pager) ViewPager viewPager;
+ @BindView(R.id.default_toolbar) Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -113,7 +113,7 @@ protected void onCreate(Bundle savedInstanceState) {
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
setContentView(R.layout.activity_remote);
- ButterKnife.inject(this);
+ ButterKnife.bind(this);
hostManager = HostManager.getInstance(this);
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteFragment.java
index bd068c436..5b5f79590 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteFragment.java
@@ -19,6 +19,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
+import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
@@ -56,9 +57,10 @@
import java.util.Set;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
import butterknife.OnClick;
import butterknife.Optional;
+import butterknife.Unbinder;
/**
* Remote view
@@ -119,38 +121,38 @@ public class RemoteFragment extends Fragment
private final ApiMethod contextButtonAction = new Input.ExecuteAction(Input.ExecuteAction.CONTEXTMENU);
private final ApiMethod osdButtonAction = new Input.ExecuteAction(Input.ExecuteAction.OSD);
- @InjectView(R.id.info_panel) RelativeLayout infoPanel;
- @InjectView(R.id.media_panel) RelativeLayout mediaPanel;
- @InjectView(R.id.remote) ControlPad controlPad;
+ @BindView(R.id.info_panel) RelativeLayout infoPanel;
+ @BindView(R.id.media_panel) RelativeLayout mediaPanel;
+ @BindView(R.id.remote) ControlPad controlPad;
- @InjectView(R.id.info_title) TextView infoTitle;
- @InjectView(R.id.info_message) TextView infoMessage;
+ @BindView(R.id.info_title) TextView infoTitle;
+ @BindView(R.id.info_message) TextView infoMessage;
- @InjectView(R.id.button_bar) LinearLayout buttonBarPanel;
+ @BindView(R.id.button_bar) LinearLayout buttonBarPanel;
/**
* Buttons
*/
- @Optional @InjectView(R.id.home) ImageButton homeButton;
- @Optional @InjectView(R.id.movies) ImageButton moviesButton;
- @Optional @InjectView(R.id.tv_shows) ImageButton tvShowsButton;
- @Optional @InjectView(R.id.music) ImageButton musicButton;
- @Optional @InjectView(R.id.pvr) ImageButton pvrButton;
- @Optional @InjectView(R.id.pictures) ImageButton picturesButton;
- @Optional @InjectView(R.id.videos) ImageButton videosButton;
- //@Optional @InjectView(R.id.favourites) ImageButton favouritesButton;
- @Optional @InjectView(R.id.addons) ImageButton addonsButton;
- @Optional @InjectView(R.id.weather) ImageButton weatherButton;
- @Optional @InjectView(R.id.system) ImageButton systemButton;
-
- @InjectView(R.id.art) ImageView thumbnail;
- @InjectView(R.id.title) TextView nowPlayingTitle;
- @InjectView(R.id.details) TextView nowPlayingDetails;
-
- @InjectView(R.id.play) ImageButton playButton;
- @InjectView(R.id.stop) ImageButton stopButton;
- @InjectView(R.id.rewind) ImageButton rewindButton;
- @InjectView(R.id.fast_forward) ImageButton fastForwardButton;
+ @Nullable @BindView(R.id.home) ImageButton homeButton;
+ @Nullable @BindView(R.id.movies) ImageButton moviesButton;
+ @Nullable @BindView(R.id.tv_shows) ImageButton tvShowsButton;
+ @Nullable @BindView(R.id.music) ImageButton musicButton;
+ @Nullable @BindView(R.id.pvr) ImageButton pvrButton;
+ @Nullable @BindView(R.id.pictures) ImageButton picturesButton;
+ @Nullable @BindView(R.id.videos) ImageButton videosButton;
+ //@Nullable @BindView(R.id.favourites) ImageButton favouritesButton;
+ @Nullable @BindView(R.id.addons) ImageButton addonsButton;
+ @Nullable @BindView(R.id.weather) ImageButton weatherButton;
+ @Nullable @BindView(R.id.system) ImageButton systemButton;
+
+ @BindView(R.id.art) ImageView thumbnail;
+ @BindView(R.id.title) TextView nowPlayingTitle;
+ @BindView(R.id.details) TextView nowPlayingDetails;
+
+ @BindView(R.id.play) ImageButton playButton;
+ @BindView(R.id.stop) ImageButton stopButton;
+ @BindView(R.id.rewind) ImageButton rewindButton;
+ @BindView(R.id.fast_forward) ImageButton fastForwardButton;
// EventServer connection
private EventServerConnection eventServerConnection = null;
@@ -158,6 +160,8 @@ public class RemoteFragment extends Fragment
// Icons for fastForward/Rewind or skipPrevious/skipNext
int fastForwardIcon, rewindIcon, skipPreviousIcon, skipNextIcon;
+ private Unbinder unbinder;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -171,7 +175,7 @@ public void onCreate(Bundle savedInstanceState) {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_remote, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
controlPad.setOnPadButtonsListener(this);
@@ -229,6 +233,12 @@ public void onPause() {
}
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
/**
* Creates a new EventServerConnection if using the event server
* is enabled in the preferences.
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/video/AllCastActivity.java b/app/src/main/java/org/xbmc/kore/ui/sections/video/AllCastActivity.java
index 008c7de62..79769582e 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/video/AllCastActivity.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/video/AllCastActivity.java
@@ -46,7 +46,7 @@
import java.util.ArrayList;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
/**
* Activity that presents all cast of a movie or TV Show
@@ -65,8 +65,8 @@ public class AllCastActivity extends BaseActivity {
NavigationDrawerFragment navigationDrawerFragment;
- @InjectView(R.id.cast_list) GridView castGridView;
- @InjectView(android.R.id.empty) TextView emptyView;
+ @BindView(R.id.cast_list) GridView castGridView;
+ @BindView(android.R.id.empty) TextView emptyView;
/**
* Returns an intent that can be used to start this activity, with all the correct parameters
@@ -87,7 +87,7 @@ public static Intent buildLaunchIntent(Context context,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_cast);
- ButterKnife.inject(this);
+ ButterKnife.bind(this);
// Set up the drawer.
navigationDrawerFragment = (NavigationDrawerFragment)getSupportFragmentManager()
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRChannelEPGListFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRChannelEPGListFragment.java
index cf990be34..6d8e1385d 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRChannelEPGListFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRChannelEPGListFragment.java
@@ -43,7 +43,8 @@
import java.util.List;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
/**
* Fragment that presents the Guide for a channel
@@ -55,9 +56,9 @@ public class PVRChannelEPGListFragment extends Fragment
private HostManager hostManager;
private int channelId;
- @InjectView(R.id.list) ListView listView;
- @InjectView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
- @InjectView(android.R.id.empty) TextView emptyView;
+ @BindView(R.id.list) ListView listView;
+ @BindView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
+ @BindView(android.R.id.empty) TextView emptyView;
/**
* Handler on which to post RPC callbacks
@@ -68,6 +69,8 @@ public class PVRChannelEPGListFragment extends Fragment
private static final String BUNDLE_KEY_CHANNELID = "bundle_key_channelid";
+ private Unbinder unbinder;
+
/**
* Create a new instance of this, initialized to show the current channel
*/
@@ -88,7 +91,7 @@ public void onCreate(Bundle savedInstanceState) {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_generic_list, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
Bundle bundle = getArguments();
channelId = bundle.getInt(BUNDLE_KEY_CHANNELID, -1);
@@ -120,6 +123,12 @@ public void onActivityCreated (Bundle savedInstanceState) {
browseEPG();
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
/**
* Swipe refresh layout callback
*/
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRChannelsListFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRChannelsListFragment.java
index 745442660..2a4d2414f 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRChannelsListFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRChannelsListFragment.java
@@ -48,7 +48,8 @@
import java.util.List;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
/**
* Fragment that presents the movie list
@@ -70,9 +71,9 @@ public interface OnPVRChannelSelectedListener {
private HostManager hostManager;
- @InjectView(R.id.list) GridView gridView;
- @InjectView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
- @InjectView(android.R.id.empty) TextView emptyView;
+ @BindView(R.id.list) GridView gridView;
+ @BindView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
+ @BindView(android.R.id.empty) TextView emptyView;
/**
* Handler on which to post RPC callbacks
@@ -86,6 +87,8 @@ public interface OnPVRChannelSelectedListener {
private int currentListType;
private boolean singleChannelGroup = false;
+ private Unbinder unbinder;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -94,7 +97,7 @@ public void onCreate(Bundle savedInstanceState) {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_generic_media_list, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
if (savedInstanceState != null) {
selectedChannelGroupId = savedInstanceState.getInt(CHANNELGROUPID);
@@ -165,6 +168,12 @@ public void onSaveInstanceState (Bundle outState) {
outState.putBoolean(SINGLECHANNELGROUP, singleChannelGroup);
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
/**
* Swipe refresh layout callback
*/
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRListFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRListFragment.java
index 2fa6ad827..029e95263 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRListFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRListFragment.java
@@ -17,44 +17,30 @@
import android.os.Bundle;
import android.support.v4.app.Fragment;
-import android.support.v4.view.ViewPager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.astuetz.PagerSlidingTabStrip;
import org.xbmc.kore.R;
+import org.xbmc.kore.ui.AbstractTabsFragment;
import org.xbmc.kore.ui.OnBackPressedListener;
import org.xbmc.kore.utils.LogUtils;
import org.xbmc.kore.utils.TabsAdapter;
-import butterknife.ButterKnife;
-import butterknife.InjectView;
-
/**
* Container for the various PVR lists
*/
-public class PVRListFragment extends Fragment
+public class PVRListFragment extends AbstractTabsFragment
implements OnBackPressedListener {
private static final String TAG = LogUtils.makeLogTag(PVRListFragment.class);
- private TabsAdapter tabsAdapter;
-
- @InjectView(R.id.pager_tab_strip) PagerSlidingTabStrip pagerTabStrip;
- @InjectView(R.id.pager) ViewPager viewPager;
-
public static final String PVR_LIST_TYPE_KEY = "pvr_list_type_key";
public static final int LIST_TV_CHANNELS = 0,
LIST_RADIO_CHANNELS = 1;
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_default_view_pager, container, false);
- ButterKnife.inject(this, root);
+ protected TabsAdapter createTabsAdapter(DataHolder dataHolder) {
+ Bundle tvArgs = new Bundle();
+ Bundle radioArgs = new Bundle();
- Bundle tvArgs = new Bundle(), radioArgs = new Bundle();
if (getArguments() != null) {
tvArgs.putAll(getArguments());
radioArgs.putAll(getArguments());
@@ -62,28 +48,17 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
tvArgs.putInt(PVR_LIST_TYPE_KEY, LIST_TV_CHANNELS);
radioArgs.putInt(PVR_LIST_TYPE_KEY, LIST_RADIO_CHANNELS);
- tabsAdapter = new TabsAdapter(getActivity(), getChildFragmentManager())
+ return new TabsAdapter(getActivity(), getChildFragmentManager())
.addTab(PVRChannelsListFragment.class, tvArgs, R.string.tv_channels, 1)
.addTab(PVRChannelsListFragment.class, radioArgs, R.string.radio_channels, 2)
.addTab(PVRRecordingsListFragment.class, getArguments(), R.string.recordings, 3);
-
- viewPager.setAdapter(tabsAdapter);
- pagerTabStrip.setViewPager(viewPager);
-
- return root;
- }
-
- @Override
- public void onActivityCreated (Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- setHasOptionsMenu(false);
}
@Override
public boolean onBackPressed() {
// Tell current fragment to move up one directory, if possible
- Fragment visibleFragment = ((TabsAdapter)viewPager.getAdapter())
- .getStoredFragment(viewPager.getCurrentItem());
+ Fragment visibleFragment = ((TabsAdapter)getViewPager().getAdapter())
+ .getStoredFragment(getViewPager().getCurrentItem());
if (visibleFragment instanceof OnBackPressedListener) {
return ((OnBackPressedListener) visibleFragment).onBackPressed();
diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRRecordingsListFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRRecordingsListFragment.java
index b61e4487a..d9cf54c85 100644
--- a/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRRecordingsListFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/sections/video/PVRRecordingsListFragment.java
@@ -43,7 +43,8 @@
import java.util.List;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
/**
* Fragment that presents the PVR recordings list
@@ -54,9 +55,9 @@ public class PVRRecordingsListFragment extends Fragment
private HostManager hostManager;
- @InjectView(R.id.list) GridView gridView;
- @InjectView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
- @InjectView(android.R.id.empty) TextView emptyView;
+ @BindView(R.id.list) GridView gridView;
+ @BindView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
+ @BindView(android.R.id.empty) TextView emptyView;
/**
* Handler on which to post RPC callbacks
@@ -65,6 +66,8 @@ public class PVRRecordingsListFragment extends Fragment
private RecordingsAdapter recordingsAdapter = null;
+ private Unbinder unbinder;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -73,7 +76,7 @@ public void onCreate(Bundle savedInstanceState) {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_generic_media_list, container, false);
- ButterKnife.inject(this, root);
+ unbinder = ButterKnife.bind(this, root);
hostManager = HostManager.getInstance(getActivity());
@@ -97,6 +100,12 @@ public void onActivityCreated (Bundle savedInstanceState) {
browseRecordings();
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ unbinder.unbind();
+ }
+
/**
* Swipe refresh layout callback
*/
diff --git a/app/src/main/java/org/xbmc/kore/ui/widgets/ControlPad.java b/app/src/main/java/org/xbmc/kore/ui/widgets/ControlPad.java
index caa26216c..a3836b944 100644
--- a/app/src/main/java/org/xbmc/kore/ui/widgets/ControlPad.java
+++ b/app/src/main/java/org/xbmc/kore/ui/widgets/ControlPad.java
@@ -40,7 +40,8 @@
import org.xbmc.kore.utils.Utils;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
public class ControlPad extends SquareGridLayout
implements View.OnClickListener, View.OnLongClickListener {
@@ -63,16 +64,17 @@ public interface OnPadButtonsListener {
}
private OnPadButtonsListener onPadButtonsListener;
-
- @InjectView(R.id.select) ImageView selectButton;
- @InjectView(R.id.left) ImageView leftButton;
- @InjectView(R.id.right) ImageView rightButton;
- @InjectView(R.id.up) ImageView upButton;
- @InjectView(R.id.down) ImageView downButton;
- @InjectView(R.id.back) ImageView backButton;
- @InjectView(R.id.info) ImageView infoButton;
- @InjectView(R.id.context) ImageView contextButton;
- @InjectView(R.id.osd) ImageView osdButton;
+ private Unbinder unbinder;
+
+ @BindView(R.id.select) ImageView selectButton;
+ @BindView(R.id.left) ImageView leftButton;
+ @BindView(R.id.right) ImageView rightButton;
+ @BindView(R.id.up) ImageView upButton;
+ @BindView(R.id.down) ImageView downButton;
+ @BindView(R.id.back) ImageView backButton;
+ @BindView(R.id.info) ImageView infoButton;
+ @BindView(R.id.context) ImageView contextButton;
+ @BindView(R.id.osd) ImageView osdButton;
public ControlPad(Context context) {
super(context);
@@ -105,13 +107,20 @@ public void setOnPadButtonsListener(OnPadButtonsListener onPadButtonsListener) {
private void initializeView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(R.layout.remote_control_pad, this);
- ButterKnife.inject(this, this);
+ View view = inflater.inflate(R.layout.remote_control_pad, this);
+ unbinder = ButterKnife.bind(this, view);
setBackgroundImage();
setupListeners(context);
}
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ unbinder.unbind();
+ onPadButtonsListener = null;
+ }
+
@Override
public void onClick(View v) {
if (onPadButtonsListener == null)
diff --git a/app/src/main/java/org/xbmc/kore/ui/widgets/MediaProgressIndicator.java b/app/src/main/java/org/xbmc/kore/ui/widgets/MediaProgressIndicator.java
index 040f38f05..b8cd2b3b5 100644
--- a/app/src/main/java/org/xbmc/kore/ui/widgets/MediaProgressIndicator.java
+++ b/app/src/main/java/org/xbmc/kore/ui/widgets/MediaProgressIndicator.java
@@ -31,14 +31,16 @@
import org.xbmc.kore.utils.UIUtils;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
public class MediaProgressIndicator extends LinearLayout {
- @InjectView(R.id.mpi_seek_bar) SeekBar seekBar;
- @InjectView(R.id.mpi_duration) TextView durationTextView;
- @InjectView(R.id.mpi_progress) TextView progressTextView;
+ @BindView(R.id.mpi_seek_bar) SeekBar seekBar;
+ @BindView(R.id.mpi_duration) TextView durationTextView;
+ @BindView(R.id.mpi_progress) TextView progressTextView;
+ private Unbinder unbinder;
private int speed = 0;
private int maxProgress;
private int progress;
@@ -69,7 +71,8 @@ public MediaProgressIndicator(Context context, AttributeSet attributeSet, int de
private void initializeView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.media_progress_indicator, this);
- ButterKnife.inject(view);
+
+ unbinder = ButterKnife.bind(this, view);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
@@ -98,6 +101,17 @@ public void onStopTrackingTouch(SeekBar seekBar) {
});
}
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+
+ seekBar.removeCallbacks(seekBarUpdater);
+
+ unbinder.unbind();
+
+ onProgressChangeListener = null;
+ }
+
@Override
protected Parcelable onSaveInstanceState() {
SavedState savedState = new SavedState(super.onSaveInstanceState());
@@ -119,6 +133,9 @@ protected void onRestoreInstanceState(Parcelable state) {
private Runnable seekBarUpdater = new Runnable() {
@Override
public void run() {
+ if (seekBar == null) // prevent NPE when Butterknife unbinds the view while there was still a runnable pending
+ return;
+
if ((maxProgress == 0) || (progress >= maxProgress)) {
seekBar.removeCallbacks(this);
return;
diff --git a/app/src/main/java/org/xbmc/kore/ui/widgets/NowPlayingPanel.java b/app/src/main/java/org/xbmc/kore/ui/widgets/NowPlayingPanel.java
index 53538baf7..eca4181be 100644
--- a/app/src/main/java/org/xbmc/kore/ui/widgets/NowPlayingPanel.java
+++ b/app/src/main/java/org/xbmc/kore/ui/widgets/NowPlayingPanel.java
@@ -33,8 +33,9 @@
import org.xbmc.kore.jsonrpc.type.GlobalType;
import org.xbmc.kore.utils.UIUtils;
+import butterknife.BindView;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.Unbinder;
public class NowPlayingPanel extends SlidingUpPanelLayout {
@@ -49,20 +50,21 @@ public interface OnPanelButtonsClickListener {
}
private OnPanelButtonsClickListener onPanelButtonsClickListener;
-
- @InjectView(R.id.npp_collapsed_view) LinearLayout collapsedView;
- @InjectView(R.id.npp_title) TextView title;
- @InjectView(R.id.npp_details) TextView details;
- @InjectView(R.id.npp_poster) ImageView poster;
- @InjectView(R.id.npp_previous) ImageButton previousButton;
- @InjectView(R.id.npp_next) ImageButton nextButton;
- @InjectView(R.id.npp_play) ImageButton playButton;
- @InjectView(R.id.npp_progress_indicator) MediaProgressIndicator mediaProgressIndicator;
- @InjectView(R.id.npp_volume_level_indicator) VolumeLevelIndicator volumeLevelIndicator;
- @InjectView(R.id.npp_volume_mute) HighlightButton volumeMuteButton;
- @InjectView(R.id.npp_volume_muted_indicator) HighlightButton volumeMutedIndicatorButton;
- @InjectView(R.id.npp_repeat) RepeatModeButton repeatModeButton;
- @InjectView(R.id.npp_shuffle) HighlightButton shuffleButton;
+ private Unbinder unbinder;
+
+ @BindView(R.id.npp_collapsed_view) LinearLayout collapsedView;
+ @BindView(R.id.npp_title) TextView title;
+ @BindView(R.id.npp_details) TextView details;
+ @BindView(R.id.npp_poster) ImageView poster;
+ @BindView(R.id.npp_previous) ImageButton previousButton;
+ @BindView(R.id.npp_next) ImageButton nextButton;
+ @BindView(R.id.npp_play) ImageButton playButton;
+ @BindView(R.id.npp_progress_indicator) MediaProgressIndicator mediaProgressIndicator;
+ @BindView(R.id.npp_volume_level_indicator) VolumeLevelIndicator volumeLevelIndicator;
+ @BindView(R.id.npp_volume_mute) HighlightButton volumeMuteButton;
+ @BindView(R.id.npp_volume_muted_indicator) HighlightButton volumeMutedIndicatorButton;
+ @BindView(R.id.npp_repeat) RepeatModeButton repeatModeButton;
+ @BindView(R.id.npp_shuffle) HighlightButton shuffleButton;
public NowPlayingPanel(Context context) {
super(context);
@@ -81,11 +83,21 @@ public NowPlayingPanel(Context context, AttributeSet attributeSet, int defStyle)
private void initializeView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.now_playing_panel, this);
- ButterKnife.inject(view);
+ unbinder = ButterKnife.bind(this, view);
+
setDragView(collapsedView);
setupButtonClickListeners();
}
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+
+ unbinder.unbind();
+
+ onPanelButtonsClickListener = null;
+ }
+
public void setOnPanelButtonsClickListener(OnPanelButtonsClickListener listener) {
onPanelButtonsClickListener = listener;
}
diff --git a/app/src/main/java/org/xbmc/kore/ui/widgets/VolumeLevelIndicator.java b/app/src/main/java/org/xbmc/kore/ui/widgets/VolumeLevelIndicator.java
index c4c17699d..09bdfb960 100644
--- a/app/src/main/java/org/xbmc/kore/ui/widgets/VolumeLevelIndicator.java
+++ b/app/src/main/java/org/xbmc/kore/ui/widgets/VolumeLevelIndicator.java
@@ -26,14 +26,16 @@
import org.xbmc.kore.R;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
public class VolumeLevelIndicator extends LinearLayout {
- @InjectView(R.id.vli_seek_bar) SeekBar volumeSeekBar;
- @InjectView(R.id.vli_volume_text) TextView volumeTextView;
+ @BindView(R.id.vli_seek_bar) SeekBar volumeSeekBar;
+ @BindView(R.id.vli_volume_text) TextView volumeTextView;
private OnVolumeChangeListener onVolumeChangeListener;
private VolumeBarTouchTrackerListener volumeBarTouchTrackerListener;
+ private Unbinder unbinder;
public interface OnVolumeChangeListener {
void onVolumeChanged(int volume);
@@ -59,10 +61,18 @@ public VolumeLevelIndicator(Context context, AttributeSet attributeSet, int defS
initializeView(context);
}
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ unbinder.unbind();
+ onVolumeChangeListener = null;
+ volumeBarTouchTrackerListener = null;
+ }
+
private void initializeView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.volume_level_indicator, this);
- ButterKnife.inject(view);
+ unbinder = ButterKnife.bind(view);
volumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
diff --git a/app/src/main/java/org/xbmc/kore/ui/widgets/fabspeeddial/DialActionButton.java b/app/src/main/java/org/xbmc/kore/ui/widgets/fabspeeddial/DialActionButton.java
index a0605c5c8..5af03d25a 100644
--- a/app/src/main/java/org/xbmc/kore/ui/widgets/fabspeeddial/DialActionButton.java
+++ b/app/src/main/java/org/xbmc/kore/ui/widgets/fabspeeddial/DialActionButton.java
@@ -37,11 +37,11 @@
import org.xbmc.kore.utils.Utils;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
public class DialActionButton extends LinearLayout {
- @InjectView(R.id.dial_label) AppCompatTextView label;
- @InjectView(R.id.dial_action_button) FloatingActionButton button;
+ @BindView(R.id.dial_label) AppCompatTextView label;
+ @BindView(R.id.dial_action_button) FloatingActionButton button;
private View anchorView;
private boolean isHiding;
@@ -171,7 +171,7 @@ public void setColorFilter(int color) {
private void initializeView(Context context, AttributeSet attrs, int defStyleAttr) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dial_action_button, this);
- ButterKnife.inject(view);
+ ButterKnife.bind(view);
// Make sure shadow is not clipped
setClipToPadding(false);
diff --git a/app/src/main/java/org/xbmc/kore/ui/widgets/fabspeeddial/FABSpeedDial.java b/app/src/main/java/org/xbmc/kore/ui/widgets/fabspeeddial/FABSpeedDial.java
index 07d289a3e..e6d92ac9c 100644
--- a/app/src/main/java/org/xbmc/kore/ui/widgets/fabspeeddial/FABSpeedDial.java
+++ b/app/src/main/java/org/xbmc/kore/ui/widgets/fabspeeddial/FABSpeedDial.java
@@ -39,7 +39,8 @@
import org.xbmc.kore.ui.animators.PulsateAnimation;
import butterknife.ButterKnife;
-import butterknife.InjectView;
+import butterknife.BindView;
+import butterknife.Unbinder;
/**
* The Floating Action Button Speed Dial uses a {@link FloatingActionButton} and can
@@ -63,9 +64,9 @@
*
*/
public class FABSpeedDial extends LinearLayout {
- @InjectView(R.id.fabspeeddial) FloatingActionButton FABMain;
- @InjectView(R.id.play_local) DialActionButton FABPlayLocal;
- @InjectView(R.id.play_remote) DialActionButton FABPlayRemote;
+ @BindView(R.id.fabspeeddial) FloatingActionButton FABMain;
+ @BindView(R.id.play_local) DialActionButton FABPlayLocal;
+ @BindView(R.id.play_remote) DialActionButton FABPlayRemote;
private final String BUNDLE_KEY_EXPANDED = "expanded";
private final String BUNDLE_KEY_PARENT = "parent";
@@ -82,6 +83,8 @@ public class FABSpeedDial extends LinearLayout {
private OvershootInterpolator showDialsInterpolator = new OvershootInterpolator();
private AccelerateInterpolator hideDialsInterpolator = new AccelerateInterpolator();
+ private Unbinder unbinder;
+
public interface DialListener {
void onLocalPlayClicked();
void onRemotePlayClicked();
@@ -109,6 +112,15 @@ public FABSpeedDial(Context context, AttributeSet attrs, int defStyleAttr, int d
initializeView(context);
}
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ unbinder.unbind();
+
+ dialListener = null;
+ fabListener = null;
+ }
+
/**
* Enables/disables the speed dials. This means that if enabled,
* the dials will be shown if the user pressed the FAB button.
@@ -246,7 +258,7 @@ private void initializeView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.fab_speed_dial, this);
- ButterKnife.inject(view);
+ unbinder = ButterKnife.bind(view);
// Makes sure shadow is not clipped
setClipToPadding(false);
diff --git a/app/src/main/res/layout/fragment_media_list.xml b/app/src/main/res/layout/fragment_media_list.xml
deleted file mode 100644
index 46b7f73fa..000000000
--- a/app/src/main/res/layout/fragment_media_list.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/testUtils/java/org/xbmc/kore/testutils/Database.java b/app/src/testUtils/java/org/xbmc/kore/testutils/Database.java
index 95dbc35fd..e3be1e347 100644
--- a/app/src/testUtils/java/org/xbmc/kore/testutils/Database.java
+++ b/app/src/testUtils/java/org/xbmc/kore/testutils/Database.java
@@ -66,16 +66,17 @@ public static void flush(ContentResolver contentResolver, HostInfo hostInfo) {
public static HostInfo addHost(Context context) {
return addHost(context, "127.0.0.1", HostConnection.PROTOCOL_TCP,
- HostInfo.DEFAULT_HTTP_PORT, HostInfo.DEFAULT_TCP_PORT, false);
+ HostInfo.DEFAULT_HTTP_PORT, HostInfo.DEFAULT_TCP_PORT, false,
+ HostInfo.DEFAULT_KODI_VERSION_MAJOR);
}
public static HostInfo addHost(Context context, String hostname, int protocol, int httpPort,
- int tcpPort, boolean useEventServer) {
+ int tcpPort, boolean useEventServer, int kodiMajorVersion) {
return HostManager.getInstance(context).addHost("TestHost", hostname, protocol, httpPort,
tcpPort, null, null, "52:54:00:12:35:02", 9,
useEventServer, HostInfo.DEFAULT_EVENT_SERVER_PORT,
- HostInfo.DEFAULT_KODI_VERSION_MAJOR,
+ kodiMajorVersion,
HostInfo.DEFAULT_KODI_VERSION_MINOR,
HostInfo.DEFAULT_KODI_VERSION_REVISION,
HostInfo.DEFAULT_KODI_VERSION_TAG,