* Authors: Nathaniel McCallum <npmccallum@redhat.com>
*
* 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 <http://www.gnu.org/licenses/>.
+ * 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.app.AlertDialog;
-import android.app.ListActivity;
-import android.content.ActivityNotFoundException;
-import android.content.DialogInterface;
-import android.content.Intent;
+import android.app.Activity;
import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.net.Uri;
+import android.database.DataSetObserver;
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 {
- private static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
- private static final List<String> 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
- });
+public class MainActivity extends Activity implements OnMenuItemClickListener {
+ private TokenAdapter mTokenAdapter;
+ private DataSetObserver mDataSetObserver;
- private TokenAdapter ta;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
- private String findAppPackage(Intent i) {
- PackageManager pm = getPackageManager();
- List<ResolveInfo> 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;
+ mTokenAdapter = new TokenAdapter(this);
+ ((GridView) findViewById(R.id.grid)).setAdapter(mTokenAdapter);
+
+ mDataSetObserver = new DataSetObserver() {
+ @Override
+ public void onChanged() {
+ super.onChanged();
+ if (mTokenAdapter.getCount() == 0)
+ findViewById(android.R.id.empty).setVisibility(View.VISIBLE);
+ else
+ findViewById(android.R.id.empty).setVisibility(View.GONE);
}
- }
+ };
+ mTokenAdapter.registerDataSetObserver(mDataSetObserver);
+ mDataSetObserver.onChanged();
+ }
- return null;
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mTokenAdapter.unregisterDataSetObserver(mDataSetObserver);
}
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ta = new TokenAdapter(this);
- setListAdapter(ta);
- }
-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
+ menu.findItem(R.id.action_add).setOnMenuItemClickListener(this);
+ menu.findItem(R.id.action_about).setOnMenuItemClickListener(this);
+ return true;
+ }
- menu.findItem(R.id.action_add).setOnMenuItemClickListener(new OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- 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 false;
- }
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_add:
+ // If the device has a camera available, try to scan for QR code
+ PackageManager pm = getPackageManager();
+ if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) &&
+ pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS)) {
+ new CameraDialogFragment().show(getFragmentManager(),
+ CameraDialogFragment.FRAGMENT_TAG);
+ } else {
+ new ManualDialogFragment().show(getFragmentManager(),
+ ManualDialogFragment.FRAGMENT_TAG);
+ }
- new AlertDialog.Builder(MainActivity.this)
- .setTitle(R.string.install_title)
- .setMessage(R.string.install_message)
- .setPositiveButton(R.string.yes, new DialogInterface.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 DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- return;
- }
- })
- .create().show();
+ return true;
- return false;
- }
- });
+ case R.id.action_about:
+ new AboutDialogFragment().show(getFragmentManager(),
+ AboutDialogFragment.FRAGMENT_TAG);
+ return true;
+ }
- return true;
- }
+ return false;
+ }
- @Override
- 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();
- } catch (TokenUriInvalidException e) {
- Toast.makeText(this, R.string.token_scan_invalid, Toast.LENGTH_SHORT).show();
- e.printStackTrace();
- }
- }
- }
+ public void tokenURIReceived(String uri) {
+ try {
+ mTokenAdapter.add(uri);
+ } catch (TokenUriInvalidException e) {
+ Toast.makeText(this, R.string.invalid_token, Toast.LENGTH_SHORT).show();
+ e.printStackTrace();
+ }
+ }
}