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