X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Forg%2Ffedorahosted%2Ffreeotp%2FMainActivity.java;h=5a2f5a7289e6d95c3a45b476d179a177054f698f;hb=275e1b17b97a635ab0e88856e4952619a62c9fc3;hp=cdd9a580a333015c117ff7017b6641e13c838116;hpb=4912a7ef9e762436bf5d4d3d4f1a1b7b91d467bb;p=~andy%2Ffreeotp diff --git a/src/org/fedorahosted/freeotp/MainActivity.java b/src/org/fedorahosted/freeotp/MainActivity.java index cdd9a58..5a2f5a7 100644 --- a/src/org/fedorahosted/freeotp/MainActivity.java +++ b/src/org/fedorahosted/freeotp/MainActivity.java @@ -4,75 +4,195 @@ * Authors: Nathaniel McCallum * * Copyright (C) 2013 Nathaniel McCallum, Red Hat - * see file 'COPYING' for use and warranty information * - * This program is free software you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * 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 * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * http://www.apache.org/licenses/LICENSE-2.0 * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * 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. + */ + +/* + * Portions Copyright 2009 ZXing authors + * + * 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 org.fedorahosted.freeotp; -import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.List; import org.fedorahosted.freeotp.Token.TokenUriInvalidException; +import org.fedorahosted.freeotp.adapters.TokenAdapter; -import android.os.Bundle; -import android.app.ListActivity; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.database.DataSetObserver; +import android.net.Uri; +import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; +import android.view.View; +import android.widget.GridView; import android.widget.Toast; -public class MainActivity extends ListActivity { +public class MainActivity extends Activity { + private static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN"; + private static final List PROVIDERS = Arrays.asList(new String[] { + "com.google.zxing.client.android", // Barcode Scanner + "com.srowen.bs.android", // Barcode Scanner+ + "com.srowen.bs.android.simple", // Barcode Scanner+ Simple + "com.google.android.apps.unveil" // Google Goggles + }); + private TokenAdapter ta; + private String findAppPackage(Intent i) { + PackageManager pm = getPackageManager(); + List ril = pm.queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); + if (ril != null) { + for (ResolveInfo ri : ril) { + if (PROVIDERS.contains(ri.activityInfo.packageName)) + return ri.activityInfo.packageName; + } + } + + return null; + } + @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - ta = new TokenAdapter(this); - setListAdapter(ta); + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + ta = new TokenAdapter(this); + ((GridView) findViewById(R.id.grid)).setAdapter(ta); + + DataSetObserver dso = new DataSetObserver() { + @Override + public void onChanged() { + super.onChanged(); + if (ta.getCount() == 0) + findViewById(android.R.id.empty).setVisibility(View.VISIBLE); + else + findViewById(android.R.id.empty).setVisibility(View.GONE); + } + }; + ta.registerDataSetObserver(dso); + dso.onChanged(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); - + menu.findItem(R.id.action_add).setOnMenuItemClickListener(new OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + AlertDialog ad = new AddTokenDialog(MainActivity.this) { + @Override + public void addToken(String uri) { + try { + ta.add(uri); + } catch (TokenUriInvalidException e) { + Toast.makeText(MainActivity.this, R.string.invalid_token, Toast.LENGTH_SHORT).show(); + e.printStackTrace(); + } + } + }; + + ad.setButton(AlertDialog.BUTTON_NEUTRAL, getString(R.string.scan_qr_code), new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Intent i = new Intent(ACTION_SCAN); + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + i.addCategory(Intent.CATEGORY_DEFAULT); + i.putExtra("SCAN_MODE", "QR_CODE_MODE"); + i.putExtra("SAVE_HISTORY", false); + + String pkg = findAppPackage(i); + if (pkg != null) { + i.setPackage(pkg); + startActivityForResult(i, 0); + return; + } + + new AlertDialog.Builder(MainActivity.this) + .setTitle(R.string.install_title) + .setMessage(R.string.install_message) + .setPositiveButton(R.string.yes, new OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Uri uri = Uri.parse("market://details?id=" + PROVIDERS.get(0)); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + try { + startActivity(intent); + } catch (ActivityNotFoundException e) { + e.printStackTrace(); + } + } + }) + .setNegativeButton(R.string.no, new OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + return; + } + }) + .create().show(); + } + }); + + ad.show(); + + return true; + } + }); + + menu.findItem(R.id.action_about).setOnMenuItemClickListener(new OnMenuItemClickListener() { + @Override public boolean onMenuItemClick(MenuItem item) { - Intent i = new Intent("com.google.zxing.client.android.SCAN"); - i.putExtra("SCAN_MODE", "QR_CODE_MODE"); - i.putExtra("SAVE_HISTORY", false); - startActivityForResult(i, 0); - return false; + new AboutDialog(MainActivity.this).show(); + return true; } }); - + return true; } - - public void onActivityResult(int requestCode, int resultCode, Intent intent) { - if (resultCode == RESULT_OK) { - try { - ta.add(this, intent.getStringExtra("SCAN_RESULT")); - } catch (NoSuchAlgorithmException e) { - Toast.makeText(this, R.string.token_scan_invalid, Toast.LENGTH_SHORT).show(); - e.printStackTrace(); + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (resultCode == RESULT_OK) { + try { + ta.add(intent.getStringExtra("SCAN_RESULT")); } catch (TokenUriInvalidException e) { - Toast.makeText(this, R.string.token_scan_invalid, Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.invalid_token, Toast.LENGTH_SHORT).show(); e.printStackTrace(); } - } - } + } + } }