1 /*
2  * Copyright (C) 2016 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 package com.example.android.appshortcuts;
17 
18 import android.app.AlertDialog;
19 import android.app.ListActivity;
20 import android.content.Context;
21 import android.content.pm.ShortcutInfo;
22 import android.os.AsyncTask;
23 import android.os.Bundle;
24 import android.util.Log;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.View.OnClickListener;
28 import android.view.ViewGroup;
29 import android.view.inputmethod.EditorInfo;
30 import android.widget.BaseAdapter;
31 import android.widget.Button;
32 import android.widget.EditText;
33 import android.widget.TextView;
34 
35 import java.util.ArrayList;
36 import java.util.List;
37 
38 public class Main extends ListActivity implements OnClickListener {
39     static final String TAG = "ShortcutSample";
40 
41     private static final String ID_ADD_WEBSITE = "add_website";
42 
43     private static final String ACTION_ADD_WEBSITE =
44             "com.example.android.shortcutsample.ADD_WEBSITE";
45 
46     private MyAdapter mAdapter;
47 
48     private ShortcutHelper mHelper;
49 
50     @Override
onCreate(Bundle savedInstanceState)51     protected void onCreate(Bundle savedInstanceState) {
52         super.onCreate(savedInstanceState);
53 
54         setContentView(R.layout.main);
55 
56         mHelper = new ShortcutHelper(this);
57 
58         mHelper.maybeRestoreAllDynamicShortcuts();
59 
60         mHelper.refreshShortcuts(/*force=*/ false);
61 
62         if (ACTION_ADD_WEBSITE.equals(getIntent().getAction())) {
63             // Invoked via the manifest shortcut.
64             addWebSite();
65         }
66 
67         mAdapter = new MyAdapter(this.getApplicationContext());
68         setListAdapter(mAdapter);
69     }
70 
71     @Override
onResume()72     protected void onResume() {
73         super.onResume();
74         refreshList();
75     }
76 
77     /**
78      * Handle the add button.
79      */
onAddPressed(View v)80     public void onAddPressed(View v) {
81         addWebSite();
82     }
83 
addWebSite()84     private void addWebSite() {
85         Log.i(TAG, "addWebSite");
86 
87         // This is important.  This allows the launcher to build a prediction model.
88         mHelper.reportShortcutUsed(ID_ADD_WEBSITE);
89 
90         final EditText editUri = new EditText(this);
91 
92         editUri.setHint("http://www.android.com/");
93         editUri.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI);
94 
95         new AlertDialog.Builder(this)
96                 .setTitle("Add new website")
97                 .setMessage("Type URL of a website")
98                 .setView(editUri)
99                 .setPositiveButton("Add", (dialog, whichButton) -> {
100                     final String url = editUri.getText().toString().trim();
101                     if (url.length() > 0) {
102                         addUriAsync(url);
103                     }
104                 })
105                 .show();
106     }
107 
addUriAsync(String uri)108     private void addUriAsync(String uri) {
109         new AsyncTask<Void, Void, Void>() {
110             @Override
111             protected Void doInBackground(Void... params) {
112                 mHelper.addWebSiteShortcut(uri);
113                 return null;
114             }
115 
116             @Override
117             protected void onPostExecute(Void aVoid) {
118                 refreshList();
119             }
120         }.execute();
121     }
122 
refreshList()123     private void refreshList() {
124         mAdapter.setShortcuts(mHelper.getShortcuts());
125     }
126 
127     @Override
onClick(View v)128     public void onClick(View v) {
129         final ShortcutInfo shortcut = (ShortcutInfo) ((View) v.getParent()).getTag();
130 
131         switch (v.getId()) {
132             case R.id.disable:
133                 if (shortcut.isEnabled()) {
134                     mHelper.disableShortcut(shortcut);
135                 } else {
136                     mHelper.enableShortcut(shortcut);
137                 }
138                 refreshList();
139                 break;
140             case R.id.remove:
141                 mHelper.removeShortcut(shortcut);
142                 refreshList();
143                 break;
144         }
145     }
146 
147     private static final List<ShortcutInfo> EMPTY_LIST = new ArrayList<>();
148 
getType(ShortcutInfo shortcut)149     private String getType(ShortcutInfo shortcut) {
150         final StringBuilder sb = new StringBuilder();
151         String sep = "";
152         if (shortcut.isDynamic()) {
153             sb.append(sep);
154             sb.append("Dynamic");
155             sep = ", ";
156         }
157         if (shortcut.isPinned()) {
158             sb.append(sep);
159             sb.append("Pinned");
160             sep = ", ";
161         }
162         if (!shortcut.isEnabled()) {
163             sb.append(sep);
164             sb.append("Disabled");
165             sep = ", ";
166         }
167         return sb.toString();
168     }
169 
170     private class MyAdapter extends BaseAdapter {
171         private final Context mContext;
172         private final LayoutInflater mInflater;
173         private List<ShortcutInfo> mList = EMPTY_LIST;
174 
MyAdapter(Context context)175         public MyAdapter(Context context) {
176             mContext = context;
177             mInflater = mContext.getSystemService(LayoutInflater.class);
178         }
179 
180         @Override
getCount()181         public int getCount() {
182             return mList.size();
183         }
184 
185         @Override
getItem(int position)186         public Object getItem(int position) {
187             return mList.get(position);
188         }
189 
190         @Override
getItemId(int position)191         public long getItemId(int position) {
192             return position;
193         }
194 
195         @Override
hasStableIds()196         public boolean hasStableIds() {
197             return false;
198         }
199 
200         @Override
areAllItemsEnabled()201         public boolean areAllItemsEnabled() {
202             return true;
203         }
204 
205         @Override
isEnabled(int position)206         public boolean isEnabled(int position) {
207             return true;
208         }
209 
setShortcuts(List<ShortcutInfo> list)210         public void setShortcuts(List<ShortcutInfo> list) {
211             mList = list;
212             notifyDataSetChanged();
213         }
214 
215         @Override
getView(int position, View convertView, ViewGroup parent)216         public View getView(int position, View convertView, ViewGroup parent) {
217             final View view;
218             if (convertView != null) {
219                 view = convertView;
220             } else {
221                 view = mInflater.inflate(R.layout.list_item, null);
222             }
223 
224             bindView(view, position, mList.get(position));
225 
226             return view;
227         }
228 
bindView(View view, int position, ShortcutInfo shortcut)229         public void bindView(View view, int position, ShortcutInfo shortcut) {
230             view.setTag(shortcut);
231 
232             final TextView line1 = (TextView) view.findViewById(R.id.line1);
233             final TextView line2 = (TextView) view.findViewById(R.id.line2);
234 
235             line1.setText(shortcut.getLongLabel());
236 
237             line2.setText(getType(shortcut));
238 
239             final Button remove = (Button) view.findViewById(R.id.remove);
240             final Button disable = (Button) view.findViewById(R.id.disable);
241 
242             disable.setText(
243                     shortcut.isEnabled() ? R.string.disable_shortcut : R.string.enable_shortcut);
244 
245             remove.setOnClickListener(Main.this);
246             disable.setOnClickListener(Main.this);
247         }
248     }
249 }
250