Test Applications Demonstrating Push API

Applications that demonstrate the usage of Push API.

Change-Id: I4a2ace230d7ac7f699c998c0df96cf95f2e85a85
This commit is contained in:
Tejas Khorana
2016-07-21 00:28:22 -07:00
parent 9aea26cf1b
commit fe23a4463e
21 changed files with 1291 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := PushApiAuthenticator
LOCAL_SDK_VERSION := current
LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 The Android Open Source Project
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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.pushapiauthenticator">
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<application android:label="Auth Tester" android:icon="@drawable/push">
<activity android:name="MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service
android:name=".MyAccountAuthenticatorService"
android:exported="true">
<intent-filter>
<action
android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data
android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator" />
</service>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,246 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 The Android Open Source Project
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.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EE6161"
android:orientation="vertical"
android:fillViewport="false">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="All Requesting 3Ps"
android:id="@+id/textView7"
android:layout_below="@+id/textView3"
android:layout_alignLeft="@+id/textView8"
android:layout_alignStart="@+id/textView8"
android:layout_marginTop="24dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="UIDs"
android:id="@+id/textView8"
android:layout_below="@+id/textView7"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Packages"
android:id="@+id/textView9"
android:layout_below="@+id/uidsrequestingapps"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="63dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="-----"
android:id="@+id/uidsrequestingapps"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView8"
android:layout_toRightOf="@+id/authenticatorstatus" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="-----"
android:id="@+id/packagesrequestingapps"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView9"
android:layout_alignRight="@+id/textView11" />
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GET!"
android:id="@+id/getallrequestingapps"
android:layout_alignTop="@+id/textView7"
android:layout_toRightOf="@+id/textView3"
android:layout_toEndOf="@+id/textView3" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Choose Account"
android:id="@+id/textView10"
android:layout_marginTop="57dp"
android:layout_below="@+id/packagesrequestingapps"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_alignParentStart="true"
android:id="@+id/accountGroup"
android:layout_below="@+id/textView10"
android:layout_alignParentLeft="true">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TERRA"
android:id="@+id/terrabutton"
android:checked="false" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AQUA"
android:id="@+id/aquabutton"
android:checked="false" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="VENTUS"
android:id="@+id/ventusbutton"
android:checked="false" />
</RadioGroup>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Options"
android:id="@+id/textView11"
android:layout_below="@+id/accountGroup"
android:layout_alignParentLeft="true" />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="220dp"
android:id="@+id/optionsGroup"
android:layout_below="@+id/textView11"
android:layout_alignParentLeft="true">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD VISIBILITY"
android:id="@+id/addButton"
android:checked="false" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="REMOVE VISIBILITY"
android:id="@+id/removeButton"
android:checked="false" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GET VISIBILITY"
android:id="@+id/getButton"
android:checked="false" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD ACCOUNT (Normal)"
android:id="@+id/addAccountButton"
android:checked="false" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD ACCOUNT EXPLICITLY w/ UID"
android:id="@+id/addAccountButtonWithUid"
android:checked="false" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="REMOVE ACCOUNT"
android:id="@+id/removeAccount"
android:checked="false" />
</RadioGroup>
<Button
android:layout_marginTop="100dp"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go!"
android:id="@+id/selectoptionbutton"
android:layout_below="@+id/optionsGroup"
android:layout_alignParentLeft="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="STATUS:"
android:id="@+id/textView12"
android:layout_below="@+id/selectoptionbutton"
android:layout_alignParentLeft="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="----"
android:id="@+id/authenticatorstatus"
android:layout_below="@+id/textView12"
android:layout_alignParentLeft="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Authenticator Application"
android:id="@+id/textView3"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/uidchooser"
android:layout_below="@+id/optionsGroup"
android:layout_alignRight="@+id/getallrequestingapps"
android:layout_alignEnd="@+id/getallrequestingapps"
android:layout_marginTop="28dp" />
</RelativeLayout>
</ScrollView>

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 The Android Open Source Project
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.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:key="key1"
android:title="Sign-in &amp; latitude">
<intent android:action="com.google.android.apps.maps.LOCATION_SETTINGS" />
</PreferenceScreen>
<PreferenceScreen
android:key="key3"
android:title="Sign-in &amp; security">
<intent android:action="com.google.android.gms.accountsettings.SECURITY_SETTINGS" />
</PreferenceScreen>
<PreferenceScreen
android:key="key8"
android:title="Sign-in &amp; security">
<intent android:action="com.google.android.gms.accountsettings.PRIVACY_SETTINGS" />
</PreferenceScreen>
<PreferenceScreen
android:key="key9"
android:title="Sign-in &amp; security">
<intent android:action=
"com.google.android.gms.accountsettings.ACCOUNT_PREFERENCES_SETTINGS" />
</PreferenceScreen>
</PreferenceScreen>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 The Android Open Source Project
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.
-->
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.example.android.pushapiauthenticator"
android:icon="@drawable/push"
android:smallIcon="@drawable/push"
android:label="This is a label"
android:customTokens="true"
android:accountPreferences="@xml/auth_account_preferences"
/>

View File

@@ -0,0 +1,217 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 com.example.android.pushapiauthenticator;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorDescription;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private static AccountManager am;
public boolean isAccountAdded(Account a) {
Account[] accounts = am.getAccountsByType(getApplicationContext().getPackageName());
for (Account account : accounts) {
if (a.equals(account)) {
return true;
}
}
return false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
am = AccountManager.get(getApplicationContext());
final Button getAllRequestingApps = (Button) findViewById(R.id.getallrequestingapps);
final TextView getAllRequesting3pUids = (TextView) findViewById(R.id.uidsrequestingapps);
final TextView getAllRequesting3pPackages =
(TextView) findViewById(R.id.packagesrequestingapps);
final RadioGroup accountChooser = (RadioGroup) findViewById(R.id.accountGroup);
final RadioGroup optionChooser = (RadioGroup) findViewById(R.id.optionsGroup);
final EditText uidChooser = (EditText) findViewById(R.id.uidchooser);
final Button selectOption = (Button) findViewById(R.id.selectoptionbutton);
final TextView authStatus = (TextView) findViewById(R.id.authenticatorstatus);
final Toast hitGet = Toast.makeText(getApplicationContext(),
"Hit the GET Button!", Toast.LENGTH_SHORT);
final Toast enterUidWarning = Toast.makeText(getApplicationContext(),
"Enter a UID!", Toast.LENGTH_SHORT);
final Toast chooseAccountWarning = Toast.makeText(getApplicationContext(),
"Choose an Account!", Toast.LENGTH_SHORT);
final Toast chooseOptionWarning = Toast.makeText(getApplicationContext(),
"Choose an Option!", Toast.LENGTH_SHORT);
final String ACCOUNT_PASSWORD = "some password";
final Bundle ACCOUNT_BUNDLE = new Bundle();
Account terraAccount = new Account("TERRA", getPackageName());
Account aquaAccount = new Account("AQUA", getPackageName());
Account ventusAccount = new Account("VENTUS", getPackageName());
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Welcome to Auth App. \nPlease make sure you have: \n\n1. Test App 1\n"
+"\n2. Test App 2 \n\ninstalled for the demo. These applications" +
" together provide tests, use cases, and proof of concept of Push API!\n")
.setTitle("WELCOME")
.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//do nothing
}
});
AlertDialog dialog = builder.create();
dialog.show();
getAllRequestingApps.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int[] allRequestedUids = am.getRequestingUidsForType(getApplicationContext()
.getPackageName());
if (allRequestedUids != null) {
StringBuilder uidMasterString = new StringBuilder();
StringBuilder packageMasterString = new StringBuilder();
for (int i = 0 ; i < allRequestedUids.length ; i++) {
uidMasterString.append(allRequestedUids[i] + ",\n\n");
packageMasterString.append(getPackageManager().
getNameForUid(allRequestedUids[i])
+ ",\n\n");
}
if (uidMasterString.length() > 0) {
getAllRequesting3pUids.setText(uidMasterString);
} else {
getAllRequesting3pUids.setText("----");
}
if (packageMasterString.length() > 0) {
getAllRequesting3pPackages.setText(packageMasterString);
} else {
getAllRequesting3pPackages.setText("----");
}
} else {
getAllRequesting3pPackages.setText("----");
getAllRequesting3pUids.setText("----");
}
}
});
selectOption.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Account currentAccount = terraAccount;
int checkedAccount = accountChooser.getCheckedRadioButtonId();
int checkedOption = optionChooser.getCheckedRadioButtonId();
if (uidChooser.getText().length() == 0) {
enterUidWarning.show();
} else if (checkedAccount == -1) {
chooseAccountWarning.show();
} else if (checkedOption == -1) {
chooseOptionWarning.show();
} else {
//all conditions satisfied
if (checkedAccount == R.id.terrabutton) {
currentAccount = terraAccount;
} else if (checkedAccount == R.id.aquabutton) {
currentAccount = aquaAccount;
} else if (checkedAccount == R.id.ventusbutton) {
currentAccount = ventusAccount;
}
String uidstr = uidChooser.getText().toString();
int uid = Integer.parseInt(uidstr);
if (checkedOption == R.id.addButton) {
am.makeAccountVisible(currentAccount, uid);
Toast.makeText(getApplicationContext(), "Giving Visibility of " +
currentAccount.name + " to " +
getPackageManager().getNameForUid(uid),
Toast.LENGTH_SHORT).show();
} else if (checkedOption == R.id.removeButton) {
am.removeAccountVisibility(currentAccount, uid);
Toast.makeText(getApplicationContext(), "Removing Visibility of " +
currentAccount.name + " to " +
getPackageManager().getNameForUid(uid),
Toast.LENGTH_SHORT).show();
} else if (checkedOption == R.id.getButton) {
Toast.makeText(getApplicationContext(), "Is " + currentAccount.name +
" visible to " + getPackageManager().getNameForUid(uid) + "?\n" +
am.isAccountVisible(currentAccount, uid), Toast.LENGTH_SHORT)
.show();
} else if (checkedOption == R.id.addAccountButton) {
Toast.makeText(getApplicationContext(), "Adding account explicitly!"
+ am.addAccountExplicitly(currentAccount, null, null),
Toast.LENGTH_SHORT).show();
} else if (checkedOption == R.id.addAccountButtonWithUid) {
int[] uidsToAdd = new int[] {uid};
Toast.makeText(getApplicationContext(), "Adding account explicitly!"
+ am.addAccountExplicitly(currentAccount, null, null, uidsToAdd)
+ " TO: " + getPackageManager().getNameForUid(uid) + "!",
Toast.LENGTH_SHORT).show();
} else if (checkedOption == R.id.removeAccount) {
Toast.makeText(getApplicationContext(), "Removing account explicitly!"
+ am.removeAccountExplicitly(currentAccount),
Toast.LENGTH_SHORT).show();
}
StringBuilder masterString = new StringBuilder();
String uidMasterString = getAllRequesting3pUids.getText().toString();
int[] allUids = am.getRequestingUidsForType(getApplicationContext().
getPackageName());
if (allUids != null) {
for (int i = 0 ; i < allUids.length ; i++) {
masterString.append(allUids[i] + "\n");
if (am.isAccountVisible(terraAccount, allUids[i])) {
masterString.append(terraAccount.name + ",");
}
if (am.isAccountVisible(aquaAccount, allUids[i])) {
masterString.append(aquaAccount.name + ",");
}
if (am.isAccountVisible(ventusAccount, allUids[i])) {
masterString.append(ventusAccount.name);
}
masterString.append("\n");
}
}
if (masterString.length() > 0) {
authStatus.setText(masterString);
}
else {
authStatus.setText("----");
}
}
}
});
}
}

View File

@@ -0,0 +1,69 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 com.example.android.pushapiauthenticator;
import android.accounts.AbstractAccountAuthenticator;
import android.accounts.Account;
import android.accounts.AccountAuthenticatorResponse;
import android.accounts.AccountManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
public class MyAccountAuthenticator extends AbstractAccountAuthenticator {
private final Context mContext;
public MyAccountAuthenticator(Context context) {
super(context);
mContext = context;
}
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
String authTokenType, String[] requiredFeatures, Bundle options) {
return null;
}
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
String authTokenType, Bundle options) {
return null;
}
public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
Bundle options) {
return null;
}
public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
return null;
}
public String getAuthTokenLabel(String authTokenType) {
return null;
}
public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account,
String[] features) {
return null;
}
public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
String authTokenType, Bundle options) {
return null;
}
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 com.example.android.pushapiauthenticator;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyAccountAuthenticatorService extends Service {
private static final String TAG = "AuthenticationService";
private final MyAccountAuthenticator authenticator = new MyAccountAuthenticator(this);
@Override
public IBinder onBind(Intent intent) {
return authenticator.getIBinder();
}
}

View File

@@ -0,0 +1,18 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := PushApiTestAppOne
LOCAL_SDK_VERSION := current
LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 The Android Open Source Project
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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.pushapithirdpartyone">
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<application android:label="3P App 1" android:icon="@drawable/push">
<activity android:name="MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name="com.example.android.pushapithirdpartyone.MessageReceiver">
<intent-filter>
<action android:name="android.accounts.NEW_ACCOUNT_VISIBLE"/>
</intent-filter>
</receiver>
<meta-data
android:name="android.accounts.SupportedLoginTypes"
android:value="com.google;com.whatsapp;com.example.android.pushapiauthenticator" />
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 The Android Open Source Project
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.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ADD8E6"
android:orientation="vertical"
android:fillViewport="false">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/relativelayout">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Test Application One"
android:id="@+id/testapponetext"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="27dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Visible Accounts"
android:id="@+id/visibleaccountstext"
android:layout_marginTop="58dp"
android:layout_below="@+id/testapponetext"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="----"
android:id="@+id/visibleaccounts"
android:layout_below="@+id/visibleaccountstext"
android:layout_alignLeft="@+id/visibleaccountstext"
android:layout_alignStart="@+id/visibleaccountstext" />
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Get!"
android:id="@+id/getvisibleaccounts"
android:layout_alignTop="@+id/visibleaccountstext"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="----"
android:id="@+id/logintypesregistered"
android:layout_below="@+id/logintypesregisteredtext"
android:layout_alignLeft="@+id/logintypesregisteredtext"
android:layout_alignStart="@+id/logintypesregisteredtext" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Accounts Registered to Support"
android:id="@+id/logintypesregisteredtext"
android:layout_marginTop="58dp"
android:layout_below="@+id/getvisibleaccounts" />
</RelativeLayout>
</ScrollView>

View File

@@ -0,0 +1,112 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 com.example.android.pushapithirdpartyone;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorDescription;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
public class MainActivity extends Activity {
private static AccountManager am;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
am = AccountManager.get(getApplicationContext());
final TextView loginTypesRegistered = (TextView) findViewById(R.id.logintypesregistered);
final TextView visibleAccounts = (TextView) findViewById(R.id.visibleaccounts);
final Button getVisibleAccounts = (Button) findViewById(R.id.getvisibleaccounts);
final Toast notifOn = Toast.makeText(getApplicationContext(), "Notifs Turned On!",
Toast.LENGTH_SHORT);
final Toast notifOff = Toast.makeText(getApplicationContext(), "Notifs Turned Off!",
Toast.LENGTH_SHORT);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Welcome to Test App 1.\nPlease make sure you have:\n\n1. Test App 2\n"
+ "\n2. Auth App \n\ninstalled for the demo. These applications together provide" +
" tests, use cases, and proof of concept of Push API!\n")
.setTitle("WELCOME")
.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//do nothing
}
});
AlertDialog dialog = builder.create();
dialog.show();
String supportedPackages = "";
try{
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
supportedPackages = bundle.getString("android.accounts.SupportedLoginTypes");
} catch (PackageManager.NameNotFoundException e) {
Log.e("PushApiTestAppOne", "Failed to load meta-data, NameNotFound: "
+ e.getMessage());
} catch (NullPointerException e) {
Log.e("PushApiTestAppOne", "Failed to load meta-data, NullPointer: " + e.getMessage());
}
String[] manifestSupportedAccountTypes = supportedPackages.split(";");
final StringBuilder masterString = new StringBuilder();
for (int i = 0 ; i < manifestSupportedAccountTypes.length ; i++) {
masterString.append(manifestSupportedAccountTypes[i] + "\n");
}
if (masterString.length() > 0) {
loginTypesRegistered.setText(masterString);
}
else {
loginTypesRegistered.setText("----");
}
getVisibleAccounts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Account[] accountsAccessedByAuthApp = am.getAccounts();
StringBuilder masterString = new StringBuilder();
for (int i = 0 ; i < accountsAccessedByAuthApp.length ; i++) {
masterString.append(accountsAccessedByAuthApp[i].name + ", " +
accountsAccessedByAuthApp[i].type + "\n");
}
if (masterString.length() > 0) {
visibleAccounts.setText(masterString);
}
else {
visibleAccounts.setText("----");
}
}
});
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 com.example.android.pushapithirdpartyone;
import android.accounts.Account;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MessageReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
Account account = (Account) intent.getParcelableExtra("android.accounts.KEY_ACCOUNT");
Toast.makeText(context, "Account " + account.name + " received by Test App 1",
Toast.LENGTH_LONG).show();
}
}

View File

@@ -0,0 +1,18 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := PushApiTestAppTwo
LOCAL_SDK_VERSION := current
LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 The Android Open Source Project
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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.pushapithirdpartytwo">
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<application android:label="3P App 2" android:icon="@drawable/push">
<activity android:name="MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name="com.example.android.pushapithirdpartytwo.MessageReceiver">
<intent-filter>
<action android:name="android.accounts.NEW_ACCOUNT_VISIBLE"/>
</intent-filter>
</receiver>
<meta-data
android:name="android.accounts.SupportedLoginTypes"
android:value="com.google;com.whatsapp;com.example.android.pushapiauthenticator" />
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 The Android Open Source Project
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.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ADE6B4"
android:orientation="vertical"
android:fillViewport="false">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:id="@+id/relativelayout">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="----"
android:id="@+id/logintypesregistered2"
android:layout_below="@+id/logintypesregisteredtext"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Accounts Registered to Support:"
android:id="@+id/logintypesregisteredtext"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="34dp"
android:layout_below="@+id/placeholder" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Visible Accounts"
android:id="@+id/textView5"
android:layout_alignTop="@+id/getvisibleaccounts2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="----"
android:id="@+id/visibleaccounts2"
android:layout_below="@+id/getvisibleaccounts2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="1dp"
android:layout_height="wrap_content"
android:id="@+id/placeholder"
android:layout_alignRight="@+id/logintypesregistered2"
android:layout_alignEnd="@+id/logintypesregistered2"
android:layout_below="@+id/visibleaccounts2" />
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Get!"
android:id="@+id/getvisibleaccounts2"
android:layout_below="@+id/textView"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="37dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Test Application Two"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
</ScrollView>

View File

@@ -0,0 +1,116 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 com.example.android.pushapithirdpartytwo;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorDescription;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
/**
* A minimal "Hello, World!" application.
*/
public class MainActivity extends Activity {
/**
* Called with the activity is first created.
*/
private static AccountManager am;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
am = AccountManager.get(getApplicationContext());
final TextView loginTypesRegistered = (TextView) findViewById(R.id.logintypesregistered2);
final TextView visibleAccounts = (TextView) findViewById(R.id.visibleaccounts2);
final Button getVisibleAccounts = (Button) findViewById(R.id.getvisibleaccounts2);
final Toast notifOn = Toast.makeText(getApplicationContext(), "Notifs Turned On!",
Toast.LENGTH_SHORT);
final Toast notifOff = Toast.makeText(getApplicationContext(), "Notifs Turned Off!",
Toast.LENGTH_SHORT);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Welcome to Test App 1.\nPlease make sure you have:\n\n1. Test App 1\n"
+ "\n2. Auth App \n\ninstalled for the demo. These applications together provide" +
" tests, use cases, and proof of concept of Push API!\n")
.setTitle("WELCOME")
.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//do nothing
}
});
AlertDialog dialog = builder.create();
dialog.show();
String supportedPackages = "";
try{
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
supportedPackages = bundle.getString("android.accounts.SupportedLoginTypes");
} catch (PackageManager.NameNotFoundException e) {
Log.e("PushApiTestAppTwo", "Failed to load meta-data, NameNotFound: "
+ e.getMessage());
} catch (NullPointerException e) {
Log.e("PushApiTestAppTwo", "Failed to load meta-data, NullPointer: " + e.getMessage());
}
String[] manifestSupportedAccountTypes = supportedPackages.split(";");
final StringBuilder masterString = new StringBuilder();
for (int i = 0 ; i < manifestSupportedAccountTypes.length ; i++) {
masterString.append(manifestSupportedAccountTypes[i] + "\n");
}
if (masterString.length() > 0) {
loginTypesRegistered.setText(masterString);
}
else {
loginTypesRegistered.setText("----");
}
getVisibleAccounts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Account[] accountsAccessedByAuthApp = am.getAccounts();
StringBuilder masterString = new StringBuilder();
for (int i = 0 ; i < accountsAccessedByAuthApp.length ; i++) {
masterString.append(accountsAccessedByAuthApp[i].name + ", " +
accountsAccessedByAuthApp[i].type + "\n");
}
if (masterString.length() > 0) {
visibleAccounts.setText(masterString);
}
else {
visibleAccounts.setText("----");
}
}
});
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 com.example.android.pushapithirdpartytwo;
import android.accounts.Account;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MessageReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
Account account = (Account) intent.getParcelableExtra("android.accounts.KEY_ACCOUNT");
Toast.makeText(context, "Account " + account.name + " received by Test App 2",
Toast.LENGTH_LONG).show();
}
}