limitations under the License.
-->
-<com.android.settings.dashboard.conditional.FocusRecyclerView
+<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dashboard_container"
android:layout_width="match_parent"
-->
<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"/>
limitations under the License.
-->
-<FrameLayout
+<com.android.settings.dashboard.conditional.FocusRecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
+ android:id="@+id/dashboard_status_recycler_view"
android:layout_width="match_parent"
- android:layout_height="match_parent"/>
\ No newline at end of file
+ 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" />
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;
import java.util.ArrayList;
import java.util.List;
-public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder>
- implements View.OnClickListener {
+public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder> {
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;
private final SuggestionsChecks mSuggestionsChecks;
private List<DashboardCategory> mCategories;
- private List<Condition> mConditions;
private List<Tile> mSuggestions;
private boolean mIsShowingAll;
private int mSuggestionMode = SUGGESTION_MODE_DEFAULT;
- private Condition mExpandedCondition = null;
private SuggestionParser mSuggestionParser;
public DashboardAdapter(Context context) {
recountItems();
}
- public void setConditions(List<Condition> conditions) {
- mConditions = conditions;
- recountItems();
- }
-
public boolean isShowingAll() {
return mIsShowingAll;
}
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) {
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;
}
}
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())) {
--- /dev/null
+/*
+ * 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);
+ }
+ }
+}
\ No newline at end of file
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 {
+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;
@Override
protected int getMetricsCategory() {
}
@Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mConditionManager = ConditionManager.get(getContext());
+ }
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
- return inflater.inflate(R.layout.dashboard_status, parent, false);
+ 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());
}
}
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;
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;
import java.util.List;
public class DashboardSummary extends InstrumentedFragment
- implements SettingsDrawerActivity.CategoryListener, ConditionManager.ConditionListener,
- FocusRecyclerView.FocusListener {
+ implements SettingsDrawerActivity.CategoryListener {
public static final boolean DEBUG = false;
private static final boolean DEBUG_TIMING = false;
private static final String TAG = "DashboardSummary";
private static final String EXTRA_SCROLL_POSITION = "scroll_position";
- private FocusRecyclerView mDashboard;
+ private RecyclerView mDashboard;
private DashboardAdapter mAdapter;
private SummaryLoader mSummaryLoader;
- private ConditionManager mConditionManager;
private SuggestionParser mSuggestionParser;
private LinearLayoutManager mLayoutManager;
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);
}
((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));
((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) {
return inflater.inflate(R.layout.dashboard, container, false);
@Override
public void onViewCreated(View view, Bundle bundle) {
- mDashboard = (FocusRecyclerView) view.findViewById(R.id.dashboard_container);
+ mDashboard = (RecyclerView) view.findViewById(R.id.dashboard_container);
mLayoutManager = new LinearLayoutManager(getContext());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
if (bundle != null) {
}
mDashboard.setLayoutManager(mLayoutManager);
mDashboard.setHasFixedSize(true);
- mDashboard.setListener(this);
+
mAdapter = new DashboardAdapter(getContext());
- mAdapter.setConditions(mConditionManager.getConditions());
mAdapter.setSuggestions(mSuggestionParser);
mDashboard.setAdapter(mAdapter);
mSummaryLoader.setAdapter(mAdapter);
- ConditionAdapterUtils.addDismiss(mDashboard);
rebuildUI();
}
public void onCategoriesChanged() {
rebuildUI();
}
-
- @Override
- public void onConditionsChanged() {
- Log.d(TAG, "onConditionsChanged");
- mAdapter.setConditions(mConditionManager.getConditions());
- }
}
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.DashboardAdapter;
+import com.android.settings.dashboard.DashboardStatusAdapter;
public class ConditionAdapterUtils {
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
- DashboardAdapter adapter = (DashboardAdapter) recyclerView.getAdapter();
+ DashboardStatusAdapter adapter = (DashboardStatusAdapter) recyclerView.getAdapter();
Object item = adapter.getItem(viewHolder.getItemId());
if (item instanceof Condition) {
((Condition) item).silence();
}
public static void bindViews(final Condition condition,
- DashboardAdapter.DashboardItemHolder view, boolean isExpanded,
+ DashboardStatusAdapter.ViewHolder view, boolean isExpanded,
View.OnClickListener onClickListener, View.OnClickListener onExpandListener) {
View card = view.itemView.findViewById(R.id.content);
card.setTag(condition);