1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.people;
18 
19 import static android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID;
20 import static android.appwidget.AppWidgetManager.INVALID_APPWIDGET_ID;
21 
22 import static com.android.systemui.people.PeopleTileViewHelper.getPersonIconBitmap;
23 import static com.android.systemui.people.PeopleTileViewHelper.getSizeInDp;
24 
25 import android.app.Activity;
26 import android.app.people.PeopleSpaceTile;
27 import android.content.Context;
28 import android.content.Intent;
29 import android.content.res.TypedArray;
30 import android.graphics.Color;
31 import android.graphics.Outline;
32 import android.graphics.drawable.GradientDrawable;
33 import android.os.Bundle;
34 import android.util.Log;
35 import android.view.View;
36 import android.view.ViewGroup;
37 import android.view.ViewOutlineProvider;
38 import android.widget.LinearLayout;
39 
40 import com.android.systemui.R;
41 import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
42 import com.android.systemui.people.widget.PeopleTileKey;
43 
44 import java.util.ArrayList;
45 import java.util.List;
46 
47 import javax.inject.Inject;
48 
49 /** People Tile Widget configuration activity that shows the user their conversation tiles. */
50 public class PeopleSpaceActivity extends Activity {
51 
52     private static final String TAG = "PeopleSpaceActivity";
53     private static final boolean DEBUG = PeopleSpaceUtils.DEBUG;
54 
55     private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
56     private Context mContext;
57     private int mAppWidgetId;
58 
59     @Inject
PeopleSpaceActivity(PeopleSpaceWidgetManager peopleSpaceWidgetManager)60     public PeopleSpaceActivity(PeopleSpaceWidgetManager peopleSpaceWidgetManager) {
61         super();
62         mPeopleSpaceWidgetManager = peopleSpaceWidgetManager;
63 
64     }
65 
66     @Override
onCreate(Bundle savedInstanceState)67     protected void onCreate(Bundle savedInstanceState) {
68         super.onCreate(savedInstanceState);
69         mContext = getApplicationContext();
70         mAppWidgetId = getIntent().getIntExtra(EXTRA_APPWIDGET_ID,
71                 INVALID_APPWIDGET_ID);
72         setResult(RESULT_CANCELED);
73     }
74 
75     /** Builds the conversation selection activity. */
buildActivity()76     private void buildActivity() {
77         List<PeopleSpaceTile> priorityTiles = new ArrayList<>();
78         List<PeopleSpaceTile> recentTiles = new ArrayList<>();
79         try {
80             priorityTiles = mPeopleSpaceWidgetManager.getPriorityTiles();
81             recentTiles = mPeopleSpaceWidgetManager.getRecentTiles();
82         } catch (Exception e) {
83             Log.e(TAG, "Couldn't retrieve conversations", e);
84         }
85 
86         // If no conversations, render activity without conversations
87         if (recentTiles.isEmpty() && priorityTiles.isEmpty()) {
88             setContentView(R.layout.people_space_activity_no_conversations);
89 
90             // The Tile preview has colorBackground as its background. Change it so it's different
91             // than the activity's background.
92             LinearLayout item = findViewById(android.R.id.background);
93             GradientDrawable shape = (GradientDrawable) item.getBackground();
94             final TypedArray ta = mContext.getTheme().obtainStyledAttributes(
95                     new int[]{com.android.internal.R.attr.colorSurface});
96             shape.setColor(ta.getColor(0, Color.WHITE));
97             return;
98         }
99 
100         setContentView(R.layout.people_space_activity);
101         setTileViews(R.id.priority, R.id.priority_tiles, priorityTiles);
102         setTileViews(R.id.recent, R.id.recent_tiles, recentTiles);
103     }
104 
105     private ViewOutlineProvider mViewOutlineProvider = new ViewOutlineProvider() {
106         @Override
107         public void getOutline(View view, Outline outline) {
108             outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(),
109                     mContext.getResources().getDimension(R.dimen.people_space_widget_radius));
110         }
111     };
112 
113     /** Sets a {@link PeopleSpaceTileView}s for each conversation. */
setTileViews(int viewId, int tilesId, List<PeopleSpaceTile> tiles)114     private void setTileViews(int viewId, int tilesId, List<PeopleSpaceTile> tiles) {
115         if (tiles.isEmpty()) {
116             LinearLayout view = findViewById(viewId);
117             view.setVisibility(View.GONE);
118             return;
119         }
120 
121         ViewGroup layout = findViewById(tilesId);
122         layout.setClipToOutline(true);
123         layout.setOutlineProvider(mViewOutlineProvider);
124         for (int i = 0; i < tiles.size(); ++i) {
125             PeopleSpaceTile tile = tiles.get(i);
126             PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext,
127                     layout, tile.getId(), i == (tiles.size() - 1));
128             setTileView(tileView, tile);
129         }
130     }
131 
132     /** Sets {@code tileView} with the data in {@code conversation}. */
setTileView(PeopleSpaceTileView tileView, PeopleSpaceTile tile)133     private void setTileView(PeopleSpaceTileView tileView, PeopleSpaceTile tile) {
134         try {
135             if (tile.getUserName() != null) {
136                 tileView.setName(tile.getUserName().toString());
137             }
138             tileView.setPersonIcon(getPersonIconBitmap(mContext, tile,
139                     getSizeInDp(mContext, R.dimen.avatar_size_for_medium,
140                             mContext.getResources().getDisplayMetrics().density)));
141 
142             PeopleTileKey key = new PeopleTileKey(tile);
143             tileView.setOnClickListener(v -> storeWidgetConfiguration(tile, key));
144         } catch (Exception e) {
145             Log.e(TAG, "Couldn't retrieve shortcut information", e);
146         }
147     }
148 
149     /** Stores the user selected configuration for {@code mAppWidgetId}. */
storeWidgetConfiguration(PeopleSpaceTile tile, PeopleTileKey key)150     private void storeWidgetConfiguration(PeopleSpaceTile tile, PeopleTileKey key) {
151         if (PeopleSpaceUtils.DEBUG) {
152             if (DEBUG) {
153                 Log.d(TAG, "Put " + tile.getUserName() + "'s shortcut ID: "
154                         + tile.getId() + " for widget ID: "
155                         + mAppWidgetId);
156             }
157         }
158         mPeopleSpaceWidgetManager.addNewWidget(mAppWidgetId, key);
159         finishActivity();
160     }
161 
162     /** Finish activity with a successful widget configuration result. */
finishActivity()163     private void finishActivity() {
164         if (DEBUG) Log.d(TAG, "Widget added!");
165         setActivityResult(RESULT_OK);
166         finish();
167     }
168 
169     /** Finish activity without choosing a widget. */
dismissActivity(View v)170     public void dismissActivity(View v) {
171         if (DEBUG) Log.d(TAG, "Activity dismissed with no widgets added!");
172         finish();
173     }
174 
setActivityResult(int result)175     private void setActivityResult(int result) {
176         Intent resultValue = new Intent();
177         resultValue.putExtra(EXTRA_APPWIDGET_ID, mAppWidgetId);
178         setResult(result, resultValue);
179     }
180 
181     @Override
onResume()182     protected void onResume() {
183         super.onResume();
184         // Refresh tile views to sync new conversations.
185         buildActivity();
186     }
187 }
188