diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCard.java b/src/com/android/settings/homepage/contextualcards/ContextualCard.java index 4e4e34f282f..ca5555b855d 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCard.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCard.java @@ -33,13 +33,16 @@ public class ContextualCard { /** * Flags indicating the type of the ContextualCard. */ - @IntDef({CardType.DEFAULT, CardType.SLICE, CardType.LEGACY_SUGGESTION, CardType.CONDITIONAL}) + @IntDef({CardType.DEFAULT, CardType.SLICE, CardType.LEGACY_SUGGESTION, CardType.CONDITIONAL, + CardType.CONDITIONAL_HEADER, CardType.CONDITIONAL_FOOTER}) @Retention(RetentionPolicy.SOURCE) public @interface CardType { int DEFAULT = 0; int SLICE = 1; int LEGACY_SUGGESTION = 2; int CONDITIONAL = 3; + int CONDITIONAL_HEADER = 4; + int CONDITIONAL_FOOTER = 5; } private final Builder mBuilder; diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java index 6fcc636d140..4eb4c6b35ba 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java @@ -42,6 +42,7 @@ public class ConditionContextualCardController implements ContextualCardControll private final ConditionManager mConditionManager; private ContextualCardUpdateListener mListener; + private boolean mIsExpanded; public ConditionContextualCardController(Context context) { mContext = context; @@ -49,6 +50,10 @@ public class ConditionContextualCardController implements ContextualCardControll mConditionManager.startMonitoringStateChange(); } + public void setIsExpanded(boolean isExpanded) { + mIsExpanded = isExpanded; + } + @Override public void setCardUpdateListener(ContextualCardUpdateListener listener) { mListener = listener; diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCard.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCard.java new file mode 100644 index 00000000000..17a5bfa45da --- /dev/null +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCard.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2018 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.homepage.contextualcards.conditional; + +import com.android.settings.homepage.contextualcards.ContextualCard; + +/** + * Data class representing a condition footer {@link ContextualCard}. + * + * Use this class for {@link ConditionFooterContextualCardRenderer} and + * {@link ConditionContextualCardController}. + */ +public class ConditionFooterContextualCard extends ContextualCard { + + private ConditionFooterContextualCard(Builder builder) { + super(builder); + } + + @Override + public int getCardType() { + return CardType.CONDITIONAL_FOOTER; + } + + public static class Builder extends ContextualCard.Builder { + + @Override + public Builder setCardType(int cardType) { + throw new IllegalArgumentException( + "Cannot change card type for " + getClass().getName()); + } + + public ConditionFooterContextualCard build() { + return new ConditionFooterContextualCard(this); + } + } +} \ No newline at end of file diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardRenderer.java new file mode 100644 index 00000000000..2465ca4ab75 --- /dev/null +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardRenderer.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2018 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.homepage.contextualcards.conditional; + +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.homepage.contextualcards.ContextualCard; +import com.android.settings.homepage.contextualcards.ContextualCardRenderer; +import com.android.settings.homepage.contextualcards.ControllerRendererPool; +import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; + +public class ConditionFooterContextualCardRenderer implements ContextualCardRenderer { + public static final int VIEW_TYPE = R.layout.homepage_condition_footer; + private static final String TAG = "ConditionFooterRenderer"; + + private final Context mContext; + private final ControllerRendererPool mControllerRendererPool; + + public ConditionFooterContextualCardRenderer(Context context, + ControllerRendererPool controllerRendererPool) { + mContext = context; + mControllerRendererPool = controllerRendererPool; + } + + @Override + public int getViewType(boolean isHalfWidth) { + return VIEW_TYPE; + } + + @Override + public RecyclerView.ViewHolder createViewHolder(View view) { + return new ConditionFooterCardHolder(view); + } + + @Override + public void bindView(RecyclerView.ViewHolder holder, ContextualCard card) { + final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory.getFactory( + mContext).getMetricsFeatureProvider(); + holder.itemView.setOnClickListener(v -> { + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, + SettingsEnums.SETTINGS_HOMEPAGE, + null /* key */, + 0 /* false */); + final ConditionContextualCardController controller = + mControllerRendererPool.getController(mContext, + ContextualCard.CardType.CONDITIONAL_FOOTER); + controller.setIsExpanded(false); + controller.onConditionsChanged(); + }); + } + + public static class ConditionFooterCardHolder extends RecyclerView.ViewHolder { + public ConditionFooterCardHolder(View itemView) { + super(itemView); + } + } +} diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCard.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCard.java new file mode 100644 index 00000000000..f1a0fede469 --- /dev/null +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCard.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2018 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.homepage.contextualcards.conditional; + +import com.android.settings.homepage.contextualcards.ContextualCard; + +import java.util.List; + +/** + * Data class representing a condition header {@link ContextualCard}. + * + * Use this class to store additional attributes on top of {@link ContextualCard} for + * {@link ConditionHeaderContextualCardRenderer} and {@link ConditionContextualCardController}. + */ +public class ConditionHeaderContextualCard extends ContextualCard { + + private final List mConditionalCards; + + private ConditionHeaderContextualCard(Builder builder) { + super(builder); + mConditionalCards = builder.mConditionalCards; + } + + @Override + public int getCardType() { + return CardType.CONDITIONAL_HEADER; + } + + public List getConditionalCards() { + return mConditionalCards; + } + + public static class Builder extends ContextualCard.Builder { + + private List mConditionalCards; + + public Builder setConditionalCards(List conditionalCards) { + mConditionalCards = conditionalCards; + return this; + } + + @Override + public Builder setCardType(int cardType) { + throw new IllegalArgumentException( + "Cannot change card type for " + getClass().getName()); + } + + public ConditionHeaderContextualCard build() { + return new ConditionHeaderContextualCard(this); + } + } +} \ No newline at end of file diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardRenderer.java new file mode 100644 index 00000000000..a98c82d4178 --- /dev/null +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardRenderer.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2018 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.homepage.contextualcards.conditional; + +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import androidx.recyclerview.widget.RecyclerView; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.homepage.contextualcards.ContextualCard; +import com.android.settings.homepage.contextualcards.ContextualCardRenderer; +import com.android.settings.homepage.contextualcards.ControllerRendererPool; +import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; + +public class ConditionHeaderContextualCardRenderer implements ContextualCardRenderer { + public static final int VIEW_TYPE = R.layout.homepage_condition_header; + private static final String TAG = "ConditionHeaderRenderer"; + + private final Context mContext; + private final ControllerRendererPool mControllerRendererPool; + + public ConditionHeaderContextualCardRenderer(Context context, + ControllerRendererPool controllerRendererPool) { + mContext = context; + mControllerRendererPool = controllerRendererPool; + } + + @Override + public int getViewType(boolean isHalfWidth) { + return VIEW_TYPE; + } + + @Override + public RecyclerView.ViewHolder createViewHolder(View view) { + return new ConditionHeaderCardHolder(view); + } + + @Override + public void bindView(RecyclerView.ViewHolder holder, ContextualCard contextualCard) { + final ConditionHeaderContextualCard headerCard = + (ConditionHeaderContextualCard) contextualCard; + final ConditionHeaderCardHolder view = (ConditionHeaderCardHolder) holder; + final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory.getFactory( + mContext).getMetricsFeatureProvider(); + view.icons.removeAllViews(); + headerCard.getConditionalCards().stream().forEach(card -> { + final ImageView icon = (ImageView) LayoutInflater.from(mContext).inflate( + R.layout.homepage_condition_header_icon, view.icons, false); + icon.setImageDrawable(card.getIconDrawable()); + view.icons.addView(icon); + }); + view.itemView.setOnClickListener(v -> { + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, + SettingsEnums.SETTINGS_HOMEPAGE, + null /* key */, + 1 /* true */); + final ConditionContextualCardController controller = + mControllerRendererPool.getController(mContext, + ContextualCard.CardType.CONDITIONAL_HEADER); + controller.setIsExpanded(true); + controller.onConditionsChanged(); + }); + } + + public static class ConditionHeaderCardHolder extends RecyclerView.ViewHolder { + public final LinearLayout icons; + public final ImageView expandIndicator; + + public ConditionHeaderCardHolder(View itemView) { + super(itemView); + icons = itemView.findViewById(R.id.header_icons_container); + expandIndicator = itemView.findViewById(R.id.expand_indicator); + } + } +}