Revert "Add a RecyclerView adapter for first tab in settings."

This reverts commit 44e7be1289.

Change-Id: I1391f41a19526ebd02a0c06e628fb1e18d454a71
This commit is contained in:
Fan Zhang
2016-04-11 16:09:39 +00:00
parent dcb2b500d4
commit 872c61249b
8 changed files with 113 additions and 293 deletions

View File

@@ -14,7 +14,7 @@
limitations under the License.
-->
<android.support.v7.widget.RecyclerView
<com.android.settings.dashboard.conditional.FocusRecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dashboard_container"
android:layout_width="match_parent"

View File

@@ -15,7 +15,7 @@
-->
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

View File

@@ -14,14 +14,8 @@
limitations under the License.
-->
<com.android.settings.dashboard.conditional.FocusRecyclerView
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dashboard_status_recycler_view"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/dashboard_padding_start"
android:paddingEnd="@dimen/dashboard_padding_end"
android:paddingTop="@dimen/dashboard_padding_top"
android:paddingBottom="@dimen/dashboard_padding_bottom"
android:clipChildren="false"
android:clipToPadding="false" />
android:layout_height="match_parent"/>

View File

@@ -29,12 +29,13 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.util.ArrayUtils;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
import com.android.settingslib.SuggestionParser;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
@@ -42,11 +43,13 @@ import com.android.settingslib.drawer.Tile;
import java.util.ArrayList;
import java.util.List;
public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder> {
public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder>
implements View.OnClickListener {
public static final String TAG = "DashboardAdapter";
private static final int NS_SPACER = 0;
private static final int NS_SUGGESTION = 1000;
private static final int NS_ITEMS = 2000;
private static final int NS_CONDITION = 3000;
private static int SUGGESTION_MODE_DEFAULT = 0;
private static int SUGGESTION_MODE_COLLAPSED = 1;
@@ -62,6 +65,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
private final SuggestionsChecks mSuggestionsChecks;
private List<DashboardCategory> mCategories;
private List<Condition> mConditions;
private List<Tile> mSuggestions;
private boolean mIsShowingAll;
@@ -70,6 +74,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
private int mSuggestionMode = SUGGESTION_MODE_DEFAULT;
private Condition mExpandedCondition = null;
private SuggestionParser mSuggestionParser;
public DashboardAdapter(Context context) {
@@ -126,6 +131,11 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
recountItems();
}
public void setConditions(List<Condition> conditions) {
mConditions = conditions;
recountItems();
}
public boolean isShowingAll() {
return mIsShowingAll;
}
@@ -141,7 +151,14 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
private void recountItems() {
reset();
boolean hasConditions = false;
for (int i = 0; mConditions != null && i < mConditions.size(); i++) {
boolean shouldShow = mConditions.get(i).shouldShow();
hasConditions |= shouldShow;
countItem(mConditions.get(i), R.layout.condition_card, shouldShow, NS_CONDITION);
}
boolean hasSuggestions = mSuggestions != null && mSuggestions.size() != 0;
countItem(null, R.layout.dashboard_spacer, hasConditions && hasSuggestions, NS_SPACER);
countItem(null, R.layout.suggestion_header, hasSuggestions, NS_SPACER);
resetCount();
if (mSuggestions != null) {
@@ -237,6 +254,16 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
case R.layout.see_all:
onBindSeeAll(holder);
break;
case R.layout.condition_card:
ConditionAdapterUtils.bindViews((Condition) mItems.get(position), holder,
mItems.get(position) == mExpandedCondition, this,
new View.OnClickListener() {
@Override
public void onClick(View v) {
onExpandClick(v);
}
});
break;
}
}
@@ -332,6 +359,42 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
return mIds.size();
}
@Override
public void onClick(View v) {
if (v.getTag() == mExpandedCondition) {
MetricsLogger.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_CLICK,
mExpandedCondition.getMetricsConstant());
mExpandedCondition.onPrimaryClick();
} else {
mExpandedCondition = (Condition) v.getTag();
MetricsLogger.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND,
mExpandedCondition.getMetricsConstant());
notifyDataSetChanged();
}
}
public void onExpandClick(View v) {
if (v.getTag() == mExpandedCondition) {
MetricsLogger.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_COLLAPSE,
mExpandedCondition.getMetricsConstant());
mExpandedCondition = null;
} else {
mExpandedCondition = (Condition) v.getTag();
MetricsLogger.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND,
mExpandedCondition.getMetricsConstant());
}
notifyDataSetChanged();
}
public Object getItem(long itemId) {
for (int i = 0; i < mIds.size(); i++) {
if (mIds.get(i) == itemId) {
return mItems.get(i);
}
}
return null;
}
public static String getSuggestionIdentifier(Context context, Tile suggestion) {
String packageName = suggestion.intent.getComponent().getPackageName();
if (packageName.equals(context.getPackageName())) {

View File

@@ -1,197 +0,0 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.dashboard;
import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.settings.R;
import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Data adapter for dashboard status fragment.
*/
public final class DashboardStatusAdapter
extends RecyclerView.Adapter<DashboardStatusAdapter.ViewHolder>
implements View.OnClickListener {
public static final int GRID_COLUMN_COUNT = 2;
// Namespaces
private static final int NS_CONDITION = 0;
// Item types
private static final int TYPE_CONDITION = R.layout.condition_card;
// Multi namespace support.
private final Context mContext;
private final List<Object> mItems = new ArrayList<>();
private final List<Integer> mTypes = new ArrayList<>();
private final List<Integer> mIds = new ArrayList<>();
private int mId;
// Layout control
private final SpanSizeLookup mSpanSizeLookup;
private List<Condition> mConditions;
private Condition mExpandedCondition = null;
public DashboardStatusAdapter(Context context) {
mContext = context;
mSpanSizeLookup = new SpanSizeLookup();
setHasStableIds(true);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(
LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case TYPE_CONDITION:
ConditionAdapterUtils.bindViews((Condition) mItems.get(position), holder,
mItems.get(position) == mExpandedCondition, this,
new View.OnClickListener() {
@Override
public void onClick(View v) {
onExpandClick(v);
}
});
}
}
@Override
public long getItemId(int position) {
return mIds.get(position);
}
@Override
public int getItemViewType(int position) {
return mTypes.get(position);
}
@Override
public int getItemCount() {
return mIds.size();
}
@Override
public void onClick(View v) {
if (v.getTag() == mExpandedCondition) {
mExpandedCondition.onPrimaryClick();
} else {
mExpandedCondition = (Condition) v.getTag();
notifyDataSetChanged();
}
}
public SpanSizeLookup getSpanSizeLookup() {
return mSpanSizeLookup;
}
public void setConditions(List<Condition> conditions) {
mConditions = conditions;
recountItems();
}
public Object getItem(long itemId) {
for (int i = 0; i < mIds.size(); i++) {
if (mIds.get(i) == itemId) {
return mItems.get(i);
}
}
return null;
}
private void countItem(Object object, int type, boolean add, int nameSpace) {
if (add) {
mItems.add(object);
mTypes.add(type);
// TODO: Counting namespaces for handling of suggestions/conds appearing/disappearing.
mIds.add(mId + nameSpace);
}
mId++;
}
private void reset() {
mItems.clear();
mTypes.clear();
mIds.clear();
resetCount();
}
private void resetCount() {
mId = 0;
}
private void recountItems() {
reset();
for (int i = 0; mConditions != null && i < mConditions.size(); i++) {
boolean shouldShow = mConditions.get(i).shouldShow();
countItem(mConditions.get(i), TYPE_CONDITION, shouldShow, NS_CONDITION);
}
notifyDataSetChanged();
}
private void onExpandClick(View v) {
if (v.getTag() == mExpandedCondition) {
mExpandedCondition = null;
} else {
mExpandedCondition = (Condition) v.getTag();
}
notifyDataSetChanged();
}
private final class SpanSizeLookup extends GridLayoutManager.SpanSizeLookup {
@Override
public int getSpanSize(int position) {
final int viewType = getItemViewType(position);
switch (viewType) {
case TYPE_CONDITION:
return 2;
default:
return 1;
}
}
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public final ImageView icon;
public final TextView title;
public final TextView summary;
public ViewHolder(View itemView) {
super(itemView);
icon = (ImageView) itemView.findViewById(android.R.id.icon);
title = (TextView) itemView.findViewById(android.R.id.title);
summary = (TextView) itemView.findViewById(android.R.id.summary);
}
}
}

View File

@@ -17,93 +17,25 @@
package com.android.settings.dashboard;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.android.internal.logging.MetricsLogger;
import com.android.settings.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
import com.android.settings.dashboard.conditional.ConditionManager;
import com.android.settings.dashboard.conditional.FocusRecyclerView;
/**
* Dashboard fragment for showing status and suggestions.
*/
public final class DashboardStatusFragment extends InstrumentedFragment
implements ConditionManager.ConditionListener, FocusRecyclerView.FocusListener {
private static final String TAG = "DashboardStatus";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private ConditionManager mConditionManager;
private DashboardStatusAdapter mAdapter;
private FocusRecyclerView mRecyclerView;
private GridLayoutManager mLayoutManager;
public final class DashboardStatusFragment extends InstrumentedFragment {
@Override
protected int getMetricsCategory() {
return DASHBOARD_STATUS;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mConditionManager = ConditionManager.get(getContext());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
final View content = inflater.inflate(R.layout.dashboard_status, parent, false);
mRecyclerView =
(FocusRecyclerView) content.findViewById(R.id.dashboard_status_recycler_view);
mAdapter = new DashboardStatusAdapter(getContext());
mAdapter.setConditions(mConditionManager.getConditions());
mLayoutManager = new GridLayoutManager(
getContext(), DashboardStatusAdapter.GRID_COLUMN_COUNT);
mLayoutManager.setOrientation(GridLayoutManager.VERTICAL);
mLayoutManager.setSpanSizeLookup(mAdapter.getSpanSizeLookup());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setListener(this);
mRecyclerView.setAdapter(mAdapter);
ConditionAdapterUtils.addDismiss(mRecyclerView);
return content;
}
@Override
public void onResume() {
super.onResume();
for (Condition c : mConditionManager.getVisibleConditions()) {
MetricsLogger.visible(getContext(), c.getMetricsConstant());
}
}
@Override
public void onPause() {
super.onPause();
for (Condition c : mConditionManager.getVisibleConditions()) {
MetricsLogger.hidden(getContext(), c.getMetricsConstant());
}
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
if (hasWindowFocus) {
mConditionManager.addListener(this);
mConditionManager.refreshAll();
} else {
mConditionManager.remListener(this);
}
}
@Override
public void onConditionsChanged() {
if (DEBUG) Log.d(TAG, "onConditionsChanged");
mAdapter.setConditions(mConditionManager.getConditions());
return inflater.inflate(R.layout.dashboard_status, parent, false);
}
}

View File

@@ -19,7 +19,6 @@ package com.android.settings.dashboard;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -31,7 +30,10 @@ import com.android.settings.InstrumentedFragment;
import com.android.settings.R;
import com.android.settings.Settings;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
import com.android.settings.dashboard.conditional.ConditionManager;
import com.android.settings.dashboard.conditional.FocusRecyclerView;
import com.android.settingslib.SuggestionParser;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.SettingsDrawerActivity;
@@ -40,7 +42,8 @@ import com.android.settingslib.drawer.Tile;
import java.util.List;
public class DashboardSummary extends InstrumentedFragment
implements SettingsDrawerActivity.CategoryListener {
implements SettingsDrawerActivity.CategoryListener, ConditionManager.ConditionListener,
FocusRecyclerView.FocusListener {
public static final boolean DEBUG = false;
private static final boolean DEBUG_TIMING = false;
private static final String TAG = "DashboardSummary";
@@ -58,9 +61,10 @@ public class DashboardSummary extends InstrumentedFragment
private static final String EXTRA_SCROLL_POSITION = "scroll_position";
private RecyclerView mDashboard;
private FocusRecyclerView mDashboard;
private DashboardAdapter mAdapter;
private SummaryLoader mSummaryLoader;
private ConditionManager mConditionManager;
private SuggestionParser mSuggestionParser;
private LinearLayoutManager mLayoutManager;
@@ -80,7 +84,7 @@ public class DashboardSummary extends InstrumentedFragment
if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
+ " ms");
Context context = getContext();
mConditionManager = ConditionManager.get(context);
mSuggestionParser = new SuggestionParser(context,
context.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering);
}
@@ -97,6 +101,9 @@ public class DashboardSummary extends InstrumentedFragment
((SettingsDrawerActivity) getActivity()).addCategoryListener(this);
mSummaryLoader.setListening(true);
for (Condition c : mConditionManager.getVisibleConditions()) {
MetricsLogger.visible(getContext(), c.getMetricsConstant());
}
for (Tile suggestion : mSuggestionParser.getSuggestions()) {
MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
@@ -109,12 +116,25 @@ public class DashboardSummary extends InstrumentedFragment
((SettingsDrawerActivity) getActivity()).remCategoryListener(this);
mSummaryLoader.setListening(false);
for (Condition c : mConditionManager.getVisibleConditions()) {
MetricsLogger.hidden(getContext(), c.getMetricsConstant());
}
for (Tile suggestion : mSuggestionParser.getSuggestions()) {
MetricsLogger.action(getContext(), MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION,
DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
}
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
if (hasWindowFocus) {
mConditionManager.addListener(this);
mConditionManager.refreshAll();
} else {
mConditionManager.remListener(this);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -130,7 +150,7 @@ public class DashboardSummary extends InstrumentedFragment
@Override
public void onViewCreated(View view, Bundle bundle) {
mDashboard = (RecyclerView) view.findViewById(R.id.dashboard_container);
mDashboard = (FocusRecyclerView) view.findViewById(R.id.dashboard_container);
mLayoutManager = new LinearLayoutManager(getContext());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
if (bundle != null) {
@@ -140,10 +160,13 @@ public class DashboardSummary extends InstrumentedFragment
mDashboard.setLayoutManager(mLayoutManager);
mDashboard.setHasFixedSize(true);
mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
mDashboard.setListener(this);
mAdapter = new DashboardAdapter(getContext());
mAdapter.setConditions(mConditionManager.getConditions());
mAdapter.setSuggestions(mSuggestionParser);
mDashboard.setAdapter(mAdapter);
mSummaryLoader.setAdapter(mAdapter);
ConditionAdapterUtils.addDismiss(mDashboard);
rebuildUI();
}
@@ -171,4 +194,10 @@ public class DashboardSummary extends InstrumentedFragment
public void onCategoriesChanged() {
rebuildUI();
}
@Override
public void onConditionsChanged() {
Log.d(TAG, "onConditionsChanged");
mAdapter.setConditions(mConditionManager.getConditions());
}
}

View File

@@ -25,11 +25,10 @@ import android.view.View.OnLayoutChangeListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardStatusAdapter;
import com.android.settings.dashboard.DashboardAdapter;
public class ConditionAdapterUtils {
@@ -50,7 +49,7 @@ public class ConditionAdapterUtils {
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
DashboardStatusAdapter adapter = (DashboardStatusAdapter) recyclerView.getAdapter();
DashboardAdapter adapter = (DashboardAdapter) recyclerView.getAdapter();
Object item = adapter.getItem(viewHolder.getItemId());
if (item instanceof Condition) {
((Condition) item).silence();
@@ -62,7 +61,7 @@ public class ConditionAdapterUtils {
}
public static void bindViews(final Condition condition,
DashboardStatusAdapter.ViewHolder view, boolean isExpanded,
DashboardAdapter.DashboardItemHolder view, boolean isExpanded,
View.OnClickListener onClickListener, View.OnClickListener onExpandListener) {
View card = view.itemView.findViewById(R.id.content);
card.setTag(condition);