From eb74e4a8d529c7db5133bb39c6e02da8df223259 Mon Sep 17 00:00:00 2001 From: Raphael Date: Mon, 15 Jun 2009 20:26:45 -0700 Subject: [PATCH 1/2] SDK Updater: different icon theme for the repository items. --- .../internal/repository/RepoSourcesAdapter.java | 10 +++++----- .../internal/repository/icons/addon_icon16.png | Bin 0 -> 485 bytes .../repository/icons/blue_ball_icon16.png | Bin 376 -> 0 bytes .../internal/repository/icons/doc_icon16.png | Bin 0 -> 217 bytes .../repository/icons/gray_ball_icon16.png | Bin 396 -> 0 bytes .../repository/icons/green_ball_icon16.png | Bin 370 -> 0 bytes .../repository/icons/purple_ball_icon16.png | Bin 392 -> 0 bytes .../internal/repository/icons/red_ball_icon16.png | Bin 380 -> 0 bytes .../internal/repository/icons/tool_icon16.png | Bin 0 -> 188 bytes 9 files changed, 5 insertions(+), 5 deletions(-) create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_icon16.png delete mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/blue_ball_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_icon16.png delete mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/gray_ball_icon16.png delete mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/green_ball_icon16.png delete mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/purple_ball_icon16.png delete mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/red_ball_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/tool_icon16.png diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java index fa530fa4f..5ed9959d0 100755 --- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java @@ -72,19 +72,19 @@ class RepoSourcesAdapter { return imgFactory.getImage("source_icon16.png"); } else if (element instanceof PlatformPackage) { - return imgFactory.getImage("red_ball_icon16.png"); + return imgFactory.getImage("android_icon_16.png"); } else if (element instanceof AddonPackage) { - return imgFactory.getImage("green_ball_icon16.png"); + return imgFactory.getImage("addon_icon16.png"); } else if (element instanceof ToolPackage) { - return imgFactory.getImage("blue_ball_icon16.png"); + return imgFactory.getImage("tool_icon16.png"); } else if (element instanceof DocPackage) { - return imgFactory.getImage("purple_ball_icon16.png"); + return imgFactory.getImage("doc_icon16.png"); } else if (element instanceof Package) { - return imgFactory.getImage("gray_ball_icon16.png"); + return imgFactory.getImage("extra_pkg_icon16.png"); } else if (element instanceof Archive) { if (((Archive) element).isCompatible()) { diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_icon16.png new file mode 100755 index 0000000000000000000000000000000000000000..1a3e0f28c15a11153165a99795b1e72345d60787 GIT binary patch literal 485 zcmVPx#24YJ`L;(K){{a7>y{D4^00E6jL_t(I%cW95O9D|4{#*rHGmHp2)L{c5i0F`E zq~a|I@(*T!{)-pL1%~7NEPK;@fjA_+YyFsC7j;u&r7{+EY zIfr<>iuz|~-Y^K0J{K;prU76RK=x1cK=p;!&kC)Dvc#B1l0Qw7KTV8jv=Y3fmyhC5 z7Xl|zRXqYgzD!k6d;7-Xa=u?=aXF8Ay@TTe0RUuG)i?N`gNUH2dZgAaWM;epjDVOZ zx)rX0d~)DJO3CBC82nS+jQe5`YvBS`174h+F312B0sq8E1fKF3O6Orq0>kA5oKAZnOr;DgP4MfrX(qm2Bl_UTFKW&RB zitYyhiutX%^bBb`jpowx@Aj^egPYY93Y{+jv8^fS+E;gDO#UGH8koV?nhV8!PkAiE bJK(WD9gzgmux~b700000NkvXXu0mjf5AM`_ literal 0 HcmV?d00001 diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/blue_ball_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/blue_ball_icon16.png deleted file mode 100755 index 2936a0ad42fd2d0e231da9eca9d1f37136d712fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmV-;0f+vHP)Px#24YJ`L;(K){{a7>y{D4^00AILL_t(I%f*v1PQySDMc-JKWkocgP;-FPF$drP zblW2C;A3!-GZt0lk}9~c%G{&e zezbrA)@bk0ehc2}=flgacWObFn>(boNZCYj185KGBe)KAM!z0+c?(ioWYHj3j4VKE zkP4_8C~Y+AqO@=8G1yD3{{o2kINMTY#Y?j41B(tc@JVYH<5Qy~2e;D~$ ztIQUT!yYt=)8ogEgbC*s)NfE>T WQ=pNjVxVjQ0000o?kLY86v z{rx8yco;T&Y-C-L=dHDQ{sVoNQ%mwwl`Zs*UwoR?E!leE5|4-;)4RNPbsuCV>m_S! zHeI!K(vb@X)w#>p+TZ+nylGQW_WJO&1zXMTbbX)mUM%ZhPx#24YJ`L;(K){{a7>y{D4^00A^fL_t(I%f*wualzF qyLaw>GqcIe%H?wT+sgm)8@~X$!3DDC5O?DM0000Px#24YJ`L;(K){{a7>y{D4^00A0FL_t(I%f*wyZG-#f*=A%S}M=ImN%2S8xTQ@)r zTp6$obT~2cGQLOLy#;mGPZSt(Dl%XO2Ech(X|dFD8-LOk3JfI`XV_2z1)u?~DsoJ6 z2I{UGaw;@XDmbgqg9tFuB?QE57y5*Vld#SqY~q-M&(jy0icGQPV3v@D z0kE|4IzFd!V5#Y8>4kt@7nT+mHV}2N9WHyWnYl7!ndq1>^7coR|K)G|1@O3o6SJG# Qw*UYD07*qoM6N<$f>AS)kN^Mx diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/purple_ball_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/purple_ball_icon16.png deleted file mode 100755 index e317f5978158a08f2c2bc13657a2fc38b4ae63cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392 zcmV;30eAk1P)Px#24YJ`L;(K){{a7>y{D4^00A&bL_t(I%f*w;O~Wu4hMyQKjjZm#06ixRfH)&A zzM_g1ItGhi20)BJrK;kP0a(Jaz8Z%^;wWkYmmYZEoAvqe_vfPPIxdmoLg}T$&*HcP zEKm#L1!)7p-FA1+=ds1Kgky2Iu2?yZZWM|{LO2lyd;H$x?S1#~wU|N0${9>kQj!6I z06-!UiH#r*xS93fSR8g5-ISCV3~SaH3>6icD>NF_yLl~Mb~AuN*&zUp#$d)vdfqBK zD-VK)VERK;6HpM?lUZ zOgv0tz6bBc+eb;+Px#24YJ`L;(K){{a7>y{D4^00AUPL_t(I%f*wyO~gP9MW2%pElYZ!fIV+$fC4z> zjHn@HP|45$Esz6nNdeSAn9U}eHHUE^kVqW%fTgb)dF(Iy+as#VDHd^}B}>j%ky4;g z*!JK%sCVG5Rqubt%Cv=Nk;@ghGsq+02y{Se_<+hoaijXS*uo0j8uARtfD7O}_(=ou z1l*zqFCt|Ed1^@+u(ssH5C!B9BIS%gps)ZEOCFQr?-(Rpi7? zn;F5u5?Tw2&DR;GWW$mMd#GE$2eo;(yAN+)Bt}%vDrkec+rfgx#yA+k-l{V)x3~w7 zB2Ovgu@R^dbQ2N})vfB);vRS?8mJl*am3il4ytxCfmsEkxiIHKLrZ>ux(9dn*DC+Z aZ~O#{NPTk|3UY1$0000Km Date: Mon, 15 Jun 2009 22:40:45 -0700 Subject: [PATCH 2/2] SDK Updater: use tri-state icon for each potential archive: accepted, refused or unknown. --- .../repository/UpdateChooserDialog.java | 164 +++++++++++------- .../internal/repository/UpdaterData.java | 2 +- .../repository/icons/accept_icon16.png | Bin 0 -> 253 bytes .../repository/icons/reject_icon16.png | Bin 0 -> 317 bytes .../repository/icons/unknown_icon16.png | Bin 0 -> 265 bytes 5 files changed, 101 insertions(+), 65 deletions(-) create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/reject_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdateChooserDialog.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdateChooserDialog.java index fd7449d7b..19d1e8c5f 100755 --- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdateChooserDialog.java +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdateChooserDialog.java @@ -16,16 +16,15 @@ package com.android.sdkuilib.internal.repository; +import com.android.sdklib.SdkConstants; import com.android.sdklib.internal.repository.Archive; +import com.android.sdkuilib.internal.repository.icons.ImageFactory; -import org.eclipse.jface.viewers.CheckStateChangedEvent; -import org.eclipse.jface.viewers.CheckboxTableViewer; -import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; @@ -54,6 +53,7 @@ import org.eclipse.swt.widgets.Text; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.HashSet; import java.util.Map; import java.util.TreeMap; @@ -69,6 +69,8 @@ final class UpdateChooserDialog extends Dialog { private final Map mNewToOldArchiveMap; private boolean mLicenseAcceptAll; private boolean mInternalLicenseRadioUpdate; + private HashSet mAccepted = new HashSet(); + private HashSet mRejected = new HashSet(); private ArrayList mResult = new ArrayList(); // UI fields @@ -77,23 +79,26 @@ final class UpdateChooserDialog extends Dialog { private Composite mPackageRootComposite; private Button mCancelButton; private Button mInstallButton; - private CheckboxTableViewer mTableViewPackage; + private TableViewer mTableViewPackage; private Table mTablePackage; private TableColumn mTableColum; private Text mPackageText; private Button mLicenseRadioAccept; - private Button mLicenseRadioRefuse; + private Button mLicenseRadioReject; private Button mLicenseRadioAcceptAll; private Group mPackageTextGroup; + private final UpdaterData mUpdaterData; + private Group mTableGroup; /** * Create the dialog. - * @param parent Parent container + * @param updaterData The updater data * @param newToOldUpdates The map [new archive => old archive] of potential updates */ - public UpdateChooserDialog(Shell parent, Map newToOldUpdates) { - super(parent, SWT.APPLICATION_MODAL); + public UpdateChooserDialog(UpdaterData updaterData, Map newToOldUpdates) { + super(updaterData.getWindowShell(), SWT.APPLICATION_MODAL); + mUpdaterData = updaterData; mNewToOldArchiveMap = new TreeMap(new Comparator() { public int compare(Archive a1, Archive a2) { @@ -152,7 +157,7 @@ final class UpdateChooserDialog extends Dialog { }); mDialogShell.setLayout(new GridLayout(3, false/*makeColumnsEqual*/)); mDialogShell.setSize(600, 400); - mDialogShell.setText(getText()); + mDialogShell.setText("Choose Packages to Install"); // Sash form mSashForm = new SashForm(mDialogShell, SWT.NONE); @@ -161,10 +166,14 @@ final class UpdateChooserDialog extends Dialog { // Left part of Sash Form - mTableViewPackage = CheckboxTableViewer.newCheckList(mSashForm, - SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE); + mTableGroup = new Group(mSashForm, SWT.NONE); + mTableGroup.setText("Packages"); + mTableGroup.setLayout(new GridLayout(1, false/*makeColumnsEqual*/)); + + mTableViewPackage = new TableViewer(mTableGroup, SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE); mTablePackage = mTableViewPackage.getTable(); mTablePackage.setHeaderVisible(false); + mTablePackage.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); mTablePackage.addSelectionListener(new SelectionAdapter() { @Override @@ -177,12 +186,6 @@ final class UpdateChooserDialog extends Dialog { } }); - mTableViewPackage.addCheckStateListener(new ICheckStateListener() { - public void checkStateChanged(CheckStateChangedEvent event) { - onPackageChecked(event); - } - }); - mTableColum = new TableColumn(mTablePackage, SWT.NONE); mTableColum.setWidth(100); mTableColum.setText("Packages"); @@ -191,6 +194,7 @@ final class UpdateChooserDialog extends Dialog { // Right part of Sash form mPackageRootComposite = new Composite(mSashForm, SWT.NONE); mPackageRootComposite.setLayout(new GridLayout(4, false/*makeColumnsEqual*/)); + mPackageRootComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); mPackageTextGroup = new Group(mPackageRootComposite, SWT.NONE); mPackageTextGroup.setText("Package Description && License"); @@ -211,10 +215,10 @@ final class UpdateChooserDialog extends Dialog { } }); - mLicenseRadioRefuse = new Button(mPackageRootComposite, SWT.RADIO); - mLicenseRadioRefuse.setText("Refuse"); - mLicenseRadioRefuse.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); - mLicenseRadioRefuse.addSelectionListener(new SelectionAdapter() { + mLicenseRadioReject = new Button(mPackageRootComposite, SWT.RADIO); + mLicenseRadioReject.setText("Reject"); + mLicenseRadioReject.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); + mLicenseRadioReject.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { onLicenseRadioSelected(); @@ -243,7 +247,7 @@ final class UpdateChooserDialog extends Dialog { mInstallButton = new Button(mDialogShell, SWT.PUSH); mInstallButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); - mInstallButton.setText("Install Selected"); + mInstallButton.setText("Install Accepted"); mInstallButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -271,11 +275,15 @@ final class UpdateChooserDialog extends Dialog { * This is deferred till the UI is created. */ private void postCreate() { + setWindowImage(); + // Fill the list with the replacement packages mTableViewPackage.setLabelProvider(new NewArchivesLabelProvider()); mTableViewPackage.setContentProvider(new NewArchivesContentProvider()); mTableViewPackage.setInput(mNewToOldArchiveMap); + // TODO automatically accept those with an empty license + adjustColumnsWidth(); // select first item @@ -283,6 +291,24 @@ final class UpdateChooserDialog extends Dialog { onPackageSelected(); } + + /** + * Creates the icon of the window shell. + */ + private void setWindowImage() { + String imageName = "android_icon_16.png"; //$NON-NLS-1$ + if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_DARWIN) { + imageName = "android_icon_128.png"; //$NON-NLS-1$ + } + + if (mUpdaterData != null) { + ImageFactory imgFactory = mUpdaterData.getImageFactory(); + if (imgFactory != null) { + mDialogShell.setImage(imgFactory.getImage(imageName)); + } + } + } + /** * Adds a listener to adjust the columns width when the parent is resized. *

@@ -343,16 +369,8 @@ final class UpdateChooserDialog extends Dialog { * completes the dialog. */ private void onInstallSelected() { - - // get list of checked items - Object[] checked = mTableViewPackage.getCheckedElements(); - - if (checked != null) { - for (Object obj : checked) { - mResult.add((Archive) obj); - } - } - + // get list of accepted items + mResult.addAll(mAccepted); mCompleted = true; } @@ -384,15 +402,6 @@ final class UpdateChooserDialog extends Dialog { return null; } - private void setSelectedAchive(Archive a) { - if (a == null) { - mTablePackage.deselectAll(); - } else { - IStructuredSelection sel = new StructuredSelection(a); - mTableViewPackage.setSelection(sel, true /*reveal*/); - } - } - private void displayInformation(Archive a) { if (a == null) { mPackageText.setText("Please select a package."); @@ -428,15 +437,17 @@ final class UpdateChooserDialog extends Dialog { if (mLicenseAcceptAll) { mLicenseRadioAcceptAll.setSelection(true); mLicenseRadioAccept.setSelection(false); - mLicenseRadioRefuse.setSelection(false); + mLicenseRadioReject.setSelection(false); } else { - boolean accept = mTableViewPackage.getChecked(a); - mLicenseRadioAcceptAll.setSelection(false); - mLicenseRadioAccept.setSelection(accept); - mLicenseRadioRefuse.setSelection(!accept); + mLicenseRadioAccept.setSelection(mAccepted.contains(a)); + mLicenseRadioReject.setSelection(mRejected.contains(a)); } + // The install button is enabled if there's at least one + // package accepted. + mInstallButton.setEnabled(mAccepted.size() > 0); + mInternalLicenseRadioUpdate = false; } @@ -453,21 +464,36 @@ final class UpdateChooserDialog extends Dialog { mInternalLicenseRadioUpdate = true; Archive a = getSelectedArchive(); + boolean needUpdate = true; if (!mLicenseAcceptAll && mLicenseRadioAcceptAll.getSelection()) { // Accept all has been switched on. Mark all packages as accepted mLicenseAcceptAll = true; - mTableViewPackage.setAllChecked(true); + mAccepted.addAll(mNewToOldArchiveMap.keySet()); + mRejected.clear(); } else if (mLicenseRadioAccept.getSelection()) { // Accept only this one mLicenseAcceptAll = false; - mTableViewPackage.setChecked(a, true); + mAccepted.add(a); + mRejected.remove(a); - } else if (mLicenseRadioRefuse.getSelection()) { - // Refuse only this one + } else if (mLicenseRadioReject.getSelection()) { + // Reject only this one mLicenseAcceptAll = false; - mTableViewPackage.setChecked(a, false); + mAccepted.remove(a); + mRejected.add(a); + + } else { + needUpdate = false; + } + + if (needUpdate) { + if (mLicenseAcceptAll) { + mTableViewPackage.refresh(); + } else { + mTableViewPackage.refresh(a); + } } mInternalLicenseRadioUpdate = false; @@ -479,24 +505,34 @@ final class UpdateChooserDialog extends Dialog { private void onPackageDoubleClick() { Archive a = getSelectedArchive(); - mTableViewPackage.setChecked(a, !mTableViewPackage.getChecked(a)); - } - - private void onPackageChecked(CheckStateChangedEvent event) { - Object e = event.getElement(); - if (e instanceof Archive) { - Archive a = (Archive) e; - - // select it - mLicenseAcceptAll = false; - setSelectedAchive(a); - updateLicenceRadios(a); + if (mAccepted.contains(a)) { + // toggle from accepted to rejected + mAccepted.remove(a); + mRejected.add(a); + } else { + // toggle from rejected or unknown to accepted + mAccepted.add(a); + mRejected.remove(a); } + + // update state + mLicenseAcceptAll = false; + mTableViewPackage.refresh(a); + updateLicenceRadios(a); } private class NewArchivesLabelProvider extends LabelProvider { @Override public Image getImage(Object element) { + ImageFactory imgFactory = mUpdaterData.getImageFactory(); + if (imgFactory != null) { + if (mAccepted.contains(element)) { + return imgFactory.getImage("accept_icon16.png"); + } else if (mRejected.contains(element)) { + return imgFactory.getImage("reject_icon16.png"); + } + return imgFactory.getImage("unknown_icon16.png"); + } return super.getImage(element); } diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java index be769b2ff..64e23ace0 100755 --- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java @@ -328,7 +328,7 @@ class UpdaterData { final Map updates = findUpdates(); - UpdateChooserDialog dialog = new UpdateChooserDialog(getWindowShell(), updates); + UpdateChooserDialog dialog = new UpdateChooserDialog(this, updates); dialog.open(); Collection result = dialog.getResult(); diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png new file mode 100755 index 0000000000000000000000000000000000000000..a9483fbe9880c6f024196099b285ca17626c9e77 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&*6db&73Xsbu>Vr7`L$YO`C`ttDiv1{gPbl;fl7ht@I zY4?vexw-d$%)0;frKqR-)mPUXOnBH5()HIlF!(mBUbv%t^CI{CycKy(EEgsc9Y xoYQ8~y70vKk1#`mw0_nF9r=IUFHUOPGnCy*ejT8)h!5ys22WQ%mvv4FO#prgMjP(ei@O2iW)05JRHR>m}H+XUZx~_ikBzol*c}Y zA_i+Vp(XyCryY3XHF3d7kIOw}_x}Ag*1mm5i2shnch)`LfB7~2W$Pw?ntH{bXFOnoBvfj30aJK;)}9}|Pu z$^8zp4$U6M4%3X*F!deqKM~?0Dl&=H!bHA7_JdGh;a2vYPoCXnj&_bV-M}8Fe0e9s znx%UT-~D{E&9gzK!8O}okHPee_6;B9p!98J8*U!{;~)IPe*R0A=(S0YR@D^Q13k>( M>FVdQ&MBb@0N}!U&;S4c literal 0 HcmV?d00001 diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png new file mode 100755 index 0000000000000000000000000000000000000000..1b97eb73963c3e43c1b2fabca9b4f1c9777cfad7 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(`db&7)0*#C7(ZZ}(^#m>9zXs00off4mxG@9 zAJCk9KtGf;OqSdcm&+?R3xIXu7udgbL8{44$rj JF6*2Ung9&6VqO3M literal 0 HcmV?d00001